1 |
gforget |
1.12 |
function []=diags_grid_parms(dirModel,listTimes,doInteractive); |
2 |
gforget |
1.8 |
%object : load grid, set params, and save both to dirMat |
3 |
|
|
%input : listTimes is the time list obtained from diags_list_times |
4 |
|
|
%(optional) doInteractive=1 allows users to specify parameters interactively |
5 |
|
|
% doInteractive = 0 (default) uses ECCO v4 parameters |
6 |
|
|
% and omits budgets and model-data misfits analyses |
7 |
gforget |
1.1 |
|
8 |
|
|
%global variables |
9 |
|
|
gcmfaces_global; |
10 |
|
|
global myparms; |
11 |
|
|
|
12 |
|
|
%load grid |
13 |
gforget |
1.12 |
if isempty(dir('GRID'))&isempty(dir('nctiles_grid'))&... |
14 |
|
|
isempty(dir([dirModel filesep 'GRID']))&... |
15 |
|
|
isempty(dir([dirModel filesep 'nctiles_grid'])); |
16 |
gforget |
1.1 |
dirGrid=input('grid directory?\n'); |
17 |
gforget |
1.10 |
elseif ~isempty(dir('GRID')); |
18 |
gforget |
1.11 |
dirGrid=['GRID' filesep]; |
19 |
gforget |
1.10 |
nF=5; |
20 |
|
|
frmt='compact'; |
21 |
|
|
memoryLimit=0; |
22 |
|
|
elseif ~isempty(dir('nctiles_grid')); |
23 |
gforget |
1.11 |
dirGrid=['nctiles_grid' filesep]; |
24 |
gforget |
1.10 |
nF=5; |
25 |
|
|
frmt='nctiles'; |
26 |
|
|
memoryLimit=0; |
27 |
gforget |
1.12 |
elseif ~isempty(dir([dirModel filesep 'GRID'])); |
28 |
|
|
dirGrid=[dirModel filesep 'GRID' filesep]; |
29 |
|
|
nF=5; |
30 |
|
|
frmt='compact'; |
31 |
|
|
memoryLimit=0; |
32 |
|
|
elseif ~isempty(dir([dirModel filesep 'nctiles_grid'])); |
33 |
|
|
dirGrid=[dirModel filesep 'nctiles_grid' filesep]; |
34 |
|
|
nF=5; |
35 |
|
|
frmt='nctiles'; |
36 |
|
|
memoryLimit=0; |
37 |
gforget |
1.1 |
end; |
38 |
gforget |
1.2 |
|
39 |
gforget |
1.8 |
if doInteractive; |
40 |
|
|
nF=input('number of faces? (1, 4, 5or 6)\n'); |
41 |
|
|
frmt=input('file format ? (''straight'', ''cube'' or ''compact'')\n'); |
42 |
|
|
memoryLimit=input('memoryLimit ? (0=load full grid, 1=load less, 2=load even less)\n'); |
43 |
|
|
end; |
44 |
gforget |
1.2 |
|
45 |
|
|
grid_load(dirGrid,nF,frmt,memoryLimit); |
46 |
gforget |
1.1 |
|
47 |
|
|
%set default for model run parameters |
48 |
gforget |
1.8 |
if doInteractive; |
49 |
|
|
choiceParams=input(['choice of default parameters? (1=ecco v4, ' ... |
50 |
|
|
'2=core, 3=ecco2 adjoint, 4=ecco v3, 5=core-Jeff)\n']); |
51 |
|
|
else; |
52 |
|
|
choiceParams=1; |
53 |
|
|
end; |
54 |
gforget |
1.2 |
myparms=default_parms(choiceParams); |
55 |
gforget |
1.1 |
|
56 |
|
|
%allow user to change model params if necessary |
57 |
gforget |
1.8 |
myparms=review_parms(myparms,listTimes,doInteractive); |
58 |
gforget |
1.1 |
|
59 |
gforget |
1.2 |
function [parms]=default_parms(choiceParams); |
60 |
gforget |
1.1 |
%set model parameters to default (ecco_v4) |
61 |
|
|
|
62 |
gforget |
1.6 |
if choiceParams==1|choiceParams==2|choiceParams==4|choiceParams==5; |
63 |
gforget |
1.3 |
parms.yearFirst=1992; %first year covered by model integration |
64 |
gforget |
1.5 |
parms.yearLast =2011; %last year covered by model integration |
65 |
gforget |
1.1 |
parms.yearInAve=[parms.yearFirst parms.yearLast]; %period for time averages and variance computations |
66 |
gforget |
1.3 |
parms.timeStep =3600; %model time step for tracers |
67 |
gforget |
1.1 |
parms.iceModel =1;%0=use freezing point 1=use pkg/seaice 2=use pkg/thsice |
68 |
gforget |
1.3 |
parms.useRFWF =1;%1=real fresh water flux 0=virtual salt flux |
69 |
|
|
parms.useNLFS =2;%2=rstar 1=nlfs 0=linear free surface |
70 |
|
|
parms.rhoconst =1029; %sea water density |
71 |
gforget |
1.1 |
parms.rcp =3994*parms.rhoconst; % sea water rho X heat capacity |
72 |
|
|
parms.rhoi = 910; %sea ice density |
73 |
|
|
parms.rhosn = 330; %snow density |
74 |
|
|
parms.flami = 3.34e05; % latent heat of fusion of ice/snow (J/kg) |
75 |
|
|
parms.flamb = 2.50e06; % latent heat of evaporation (J/kg) |
76 |
gforget |
1.3 |
parms.SIsal0 =4; |
77 |
gforget |
1.2 |
if choiceParams==2; |
78 |
|
|
parms.yearFirst=1948; %first year covered by model integration |
79 |
|
|
parms.yearLast =2007; %last year covered by model integration |
80 |
gforget |
1.7 |
parms.yearInAve = [1948 2007]; |
81 |
gforget |
1.2 |
end; |
82 |
gforget |
1.4 |
if choiceParams==4; |
83 |
|
|
parms.useRFWF =0;%1=real fresh water flux 0=virtual salt flux |
84 |
|
|
parms.useNLFS =0;%2=rstar 1=nlfs 0=linear free surface |
85 |
|
|
end; |
86 |
gforget |
1.6 |
if choiceParams==5; |
87 |
|
|
parms.yearFirst=2006; %first year covered by model integration |
88 |
|
|
parms.yearLast =2305; %last year covered by model integration |
89 |
|
|
parms.yearInAve = [2006 2305]; |
90 |
|
|
end; |
91 |
gforget |
1.2 |
end; |
92 |
|
|
|
93 |
|
|
if choiceParams==3; |
94 |
|
|
parms.yearFirst=2004; %first year covered by model integration |
95 |
|
|
parms.yearLast =2005; %last year covered by model integration |
96 |
|
|
parms.yearInAve=[parms.yearFirst parms.yearLast]; %period for time averages and variance computations |
97 |
|
|
parms.timeStep =1200; %model time step for tracers |
98 |
|
|
parms.iceModel =1;%0=use freezing point 1=use pkg/seaice 2=use pkg/thsice |
99 |
|
|
parms.useRFWF =0;%1=real fresh water flux 0=virtual salt flux |
100 |
|
|
parms.useNLFS =0;%2=rstar 1=nlfs 0=linear free surface |
101 |
|
|
parms.rhoconst =1027.5; %sea water density |
102 |
|
|
parms.rcp =3994*parms.rhoconst; % sea water rho X heat capacity |
103 |
|
|
parms.rhoi = 910; %sea ice density |
104 |
|
|
parms.rhosn = 330; %snow density |
105 |
|
|
parms.flami = 3.34e05; % latent heat of fusion of ice/snow (J/kg) |
106 |
|
|
parms.flamb = 2.50e06; % latent heat of evaporation (J/kg) |
107 |
|
|
parms.SIsal0 = 0; |
108 |
|
|
end; |
109 |
gforget |
1.1 |
|
110 |
gforget |
1.8 |
function [parms]=review_parms(parms,listTimes,doInteractive); |
111 |
gforget |
1.1 |
%review model parameters, correct them if needed, and check a couple more things |
112 |
|
|
|
113 |
|
|
test1=1;%so that we print params at least once |
114 |
|
|
while test1; |
115 |
|
|
fprintf('\n\n'); |
116 |
|
|
gcmfaces_msg('model parameters summary','==== '); |
117 |
|
|
|
118 |
|
|
tmp1=sprintf('parms.yearFirst = %i (first year covered by model integration)',parms.yearFirst); gcmfaces_msg(tmp1,'== '); |
119 |
|
|
tmp1=sprintf('parms.yearLast = %i (first year covered by model integration)',parms.yearLast); gcmfaces_msg(tmp1,'== '); |
120 |
|
|
tmp1=sprintf('parms.yearInAve = [%i %i] (time mean and variance years)',parms.yearInAve); gcmfaces_msg(tmp1,'== '); |
121 |
|
|
tmp1=sprintf('parms.timeStep = %i (model time step for tracers)',parms.timeStep); gcmfaces_msg(tmp1,'== '); |
122 |
|
|
tmp1=sprintf('parms.iceModel = %i (0=freezing point 1=pkg/seaice 2=pkg/thsice)',parms.iceModel); gcmfaces_msg(tmp1,'== '); |
123 |
|
|
tmp1=sprintf('parms.useRFWF = %i (1=real fresh water flux 0=virtual salt flux)',parms.useRFWF); gcmfaces_msg(tmp1,'== '); |
124 |
|
|
tmp1=sprintf('parms.useNLFS = %i; (2=rstar 1=nlfs 0=linear free surface)',parms.useNLFS); gcmfaces_msg(tmp1,'== '); |
125 |
|
|
tmp1=sprintf('parms.rhoconst = %0.6g (sea water density)',parms.rhoconst); gcmfaces_msg(tmp1,'== '); |
126 |
|
|
tmp1=sprintf('parms.rcp = %0.6g (sea water density X heat capacity)',parms.rcp); gcmfaces_msg(tmp1,'== '); |
127 |
|
|
if parms.iceModel==1; |
128 |
|
|
tmp1=sprintf('parms.rhoi = %0.6g (sea ice density)',parms.rhoi); gcmfaces_msg(tmp1,'== '); |
129 |
|
|
tmp1=sprintf('parms.rhosn = %0.6g (snow density)',parms.rhosn); gcmfaces_msg(tmp1,'== '); |
130 |
|
|
tmp1=sprintf('parms.flami = %0.6g (latent heat of fusion of ice/snow in J/kg)',parms.flami); gcmfaces_msg(tmp1,'== '); |
131 |
|
|
tmp1=sprintf('parms.flamb = %0.6g (latent heat of evaporation in J/kg)',parms.flamb); gcmfaces_msg(tmp1,'== '); |
132 |
|
|
tmp1=sprintf('parms.SIsal0 = %0.6g (sea ice constant salinity)',parms.SIsal0); gcmfaces_msg(tmp1,'== '); |
133 |
|
|
%tmp1=sprintf('',); gcmfaces_msg(tmp1,'== '); |
134 |
|
|
else; |
135 |
|
|
error('only parms.iceModel=1 is currently treated\n'); |
136 |
|
|
end; |
137 |
|
|
|
138 |
gforget |
1.8 |
if doInteractive; |
139 |
|
|
gcmfaces_msg('to change a param type e.g. ''parms.yearFirst=1;'' or hit return if all params are ok. Change a param?','==== '); |
140 |
|
|
tmp1=input(''); |
141 |
|
|
test1=~isempty(tmp1); %so that we change param and iterate process |
142 |
|
|
if test1; eval(tmp1); end; |
143 |
|
|
else; |
144 |
|
|
test1=[]; |
145 |
|
|
end; |
146 |
gforget |
1.1 |
end; |
147 |
|
|
|
148 |
|
|
%determine a few more things about the diagnostic time axis |
149 |
|
|
fprintf('\n\n'); |
150 |
|
|
parms.diagsNbRec=length(listTimes); |
151 |
|
|
test1=median(diff(listTimes)*parms.timeStep/86400); |
152 |
|
|
if abs(test1-30.5)<1; parms.diagsAreMonthly=1; else; parms.diagsAreMonthly=0; end; |
153 |
|
|
if abs(test1-365.25)<1; parms.diagsAreAnnual=1; else; parms.diagsAreAnnual=0; end; |
154 |
gforget |
1.8 |
if doInteractive; |
155 |
gforget |
1.9 |
tmp1=sprintf('parms.diagsNbRec = %i (number of records, based on model output files)',parms.diagsNbRec); gcmfaces_msg(tmp1,'== '); |
156 |
|
|
tmp1=sprintf('parms.diagsAreMonthly = %i (0/1 = false/true; based on output frequency)',parms.diagsAreMonthly); gcmfaces_msg(tmp1,'== '); |
157 |
|
|
tmp1=sprintf('parms.diagsAreAnnual = %i (0/1 = false/true; based on output frequency)',parms.diagsAreAnnual); gcmfaces_msg(tmp1,'== '); |
158 |
gforget |
1.8 |
gcmfaces_msg('hit return if this seems correct otherwise stop here','== '); test0=input(''); if ~isempty(test0); error('likely dir problem'); end; |
159 |
|
|
end; |
160 |
gforget |
1.1 |
|
161 |
|
|
listTimes2=parms.yearFirst+listTimes*parms.timeStep/86400/365.25;%this approximation of course makes things simpler |
162 |
|
|
tmp1=-0.5*diff(listTimes,1,1)*parms.timeStep/86400/365.25; tmp1=[median(tmp1);tmp1]; |
163 |
|
|
listTimes2=listTimes2+tmp1;%this converts the enddate to the middate of pkg/diags |
164 |
|
|
ii=find(listTimes2>=parms.yearInAve(1)&listTimes2<=parms.yearInAve(2)+1); |
165 |
|
|
if parms.diagsAreMonthly;%then restrict to full years |
166 |
gforget |
1.6 |
ni=floor(length(ii)/12)*12; |
167 |
|
|
if ni>0; |
168 |
|
|
parms.recInAve=[ii(1) ii(floor(ni))]; |
169 |
|
|
else; |
170 |
|
|
parms.recInAve=[ii(1) ii(end)]; |
171 |
|
|
end; |
172 |
gforget |
1.1 |
elseif ~isempty(ii); |
173 |
|
|
parms.recInAve=[ii(1) ii(end)]; |
174 |
|
|
else; |
175 |
|
|
parms.recInAve=[1 1]; |
176 |
|
|
end; |
177 |
gforget |
1.9 |
if doInteractive; |
178 |
|
|
tmp1=sprintf('parms.recInAve = [%i %i] (time mean and variance records)',parms.recInAve); gcmfaces_msg(tmp1,'== '); |
179 |
|
|
end; |
180 |
gforget |
1.1 |
|
181 |
|
|
fprintf('\n\n'); |
182 |
|
|
|