| 1 |
function [GRID] = loadgrid(varargin) |
| 2 |
%loadgrid() |
| 3 |
%loadgrid(DIRECTORY) |
| 4 |
% |
| 5 |
%Reads MITgcm output files and input "data" file to create a GRID structure |
| 6 |
%If DIRECTORY is not specified the current working directory is used. |
| 7 |
% |
| 8 |
%The following files are expected to be in the directory: |
| 9 |
% data XC.* YC.* XG.* YG.* DXG.* DYG.* RAC.* hFacC.* hFacW.* hFacS.* |
| 10 |
% |
| 11 |
%e.g. |
| 12 |
%>> GRID=loadgrid |
| 13 |
%GRID = |
| 14 |
% drf: [50 70 100 140 190 240 290 340 390 440 490 540 590 640 690] |
| 15 |
% drc: [25 60 85 120 165 215 265 315 365 415 465 515 565 615 665] |
| 16 |
% rf: [1x16 double] |
| 17 |
% rc: [1x15 double] |
| 18 |
% xc: [90x40 double] |
| 19 |
% yc: [90x40 double] |
| 20 |
% xg: [90x40 double] |
| 21 |
% yg: [90x40 double] |
| 22 |
% dxg: [90x40 double] |
| 23 |
% dyg: [90x40 double] |
| 24 |
% rac: [90x40 double] |
| 25 |
% hfacc: [90x40x15 double] |
| 26 |
% hfacw: [90x40x15 double] |
| 27 |
% hfacs: [90x40x15 double] |
| 28 |
% mskc: [90x40x15 double] |
| 29 |
% mAtl: [90x40 double] |
| 30 |
% matl: [90x40 double] |
| 31 |
% mPac: [90x40 double] |
| 32 |
% mpac: [90x40 double] |
| 33 |
% msoc: [90x40 double] |
| 34 |
%>> GRID2=loadgrid('/scratch/john/run2/'); |
| 35 |
% |
| 36 |
%Most elements of the structure are named to corresponding to MITgcm |
| 37 |
%variables. |
| 38 |
% |
| 39 |
%Lower case regional masks (matl, mpac and msoc) denote Atlantic and Pacific |
| 40 |
%Southern Ocean regions only and are exclusive (i.e. matl does not extend |
| 41 |
%into the Southern Ocean). |
| 42 |
%Upper case regional masks (mAtl and mPac) denotes sectors and do include the |
| 43 |
%Southern Ocean. |
| 44 |
% sum(sum( GRID.mskc(:,:,1) )) = sum( GRID.mAtl(:) + GRID.mPac(:) ) |
| 45 |
% = sum( GRID.matl(:) + GRID.mpac(:) + GRID.msoc(:) ) |
| 46 |
% |
| 47 |
%Written by adcroft@mit.edu, 2001 |
| 48 |
%$Header: |
| 49 |
|
| 50 |
if nargin==0 |
| 51 |
Dir='./'; |
| 52 |
elseif nargin==1 |
| 53 |
Dir=[varargin{1} '/']; |
| 54 |
else |
| 55 |
error('I don''t know what to do with the second argument'); |
| 56 |
end |
| 57 |
|
| 58 |
% Extract drF from "data" file |
| 59 |
datafile=[Dir 'data']; |
| 60 |
fid=fopen(datafile,'r'); |
| 61 |
if fid==-1 |
| 62 |
error(['Could not open file:' datafile ' for reading']); |
| 63 |
end |
| 64 |
fclose(fid); |
| 65 |
drf=evalc([ ... |
| 66 |
'! grep -v ''#'' ' datafile ... |
| 67 |
'| awk ''/[dD[eE][lL][rRzZpP]/,/XXX/ {printf "%s",$0}'' ' ... |
| 68 |
'| sed ''s/[dD][eE][lL][zZrRpP][ ]*=\([0-9Ee,\. +\-]*\).*/\1/'' ' ... |
| 69 |
'| sed ''s/[ ]//g'' ' ... |
| 70 |
'| sed ''s/,/ /g'' ' ... |
| 71 |
';' |
| 72 |
]); |
| 73 |
eval(['drf=[' drf '];']) |
| 74 |
drf=drf; |
| 75 |
drc=(drf([1 1:end-1])+drf)/2; drc(1)=drc(1)/2; |
| 76 |
|
| 77 |
%% % Extract drC from output file |
| 78 |
%% outputfile='output.txt'; |
| 79 |
%% drc=evalc(['!head -1000 ' outputfile ... |
| 80 |
%% ' | awk ''/drC/,/;/ {print $3}'' -' ... |
| 81 |
%% ' | egrep "e|E"' ... |
| 82 |
%% ' | sed ''s/,//'' ']); |
| 83 |
%% eval(['drc=[' drc '];']) |
| 84 |
%% drc=drc'; |
| 85 |
%% % Extract drF from output file |
| 86 |
%% drf=evalc('!head -1000 output.txt | awk "/drF/,/;/ {print \$3}" - | egrep "e|E" | sed s/,// '); |
| 87 |
%% eval(['drf=[' drf '];']) |
| 88 |
%% drf=drf'; |
| 89 |
|
| 90 |
rf=-cumsum([0 drf]); |
| 91 |
rc=-cumsum([drc]); |
| 92 |
|
| 93 |
GRID.drf=drf; |
| 94 |
GRID.drc=drc; |
| 95 |
GRID.rf=rf; |
| 96 |
GRID.rc=rc; |
| 97 |
|
| 98 |
msg1='Error: Grid data written by the model is needed. The following files are needed: XC.* YC.* XG.* YG.* DXG.* DYG.* RAC.* hFacC.* hFacW.* hFacS.*'; |
| 99 |
msg2='Error: The appropriate model output files are not present. If the following files were not written by the model check that you have version 1.11 or greater of ini_grid.F: DXG.* DYG.* RAC.*'; |
| 100 |
|
| 101 |
xc=locrdmds([Dir 'XC'],msg1); GRID.xc=xc; |
| 102 |
yc=locrdmds([Dir 'YC'],msg1); GRID.yc=yc; |
| 103 |
xg=locrdmds([Dir 'XG'],msg1); GRID.xg=xg; |
| 104 |
yg=locrdmds([Dir 'YG'],msg1); GRID.yg=yg; |
| 105 |
dxg=locrdmds([Dir 'DXG'],msg2); GRID.dxg=dxg; |
| 106 |
dyg=locrdmds([Dir 'DYG'],msg2); GRID.dyg=dyg; |
| 107 |
rac=locrdmds([Dir 'RAC'],msg2); GRID.rac=rac; |
| 108 |
hfacc=locrdmds([Dir 'hFacC'],msg1); GRID.hfacc=hfacc; |
| 109 |
hfacw=locrdmds([Dir 'hFacW'],msg1); GRID.hfacw=hfacw; |
| 110 |
hfacs=locrdmds([Dir 'hFacS'],msg1); GRID.hfacs=hfacs; |
| 111 |
|
| 112 |
mskc=hfacc; mskc(find(hfacc~=0))=1; GRID.mskc=mskc; |
| 113 |
|
| 114 |
mskc=mskc(:,:,1); |
| 115 |
j=[]; |
| 116 |
%j=[j find( yc>-32.5 & xc>290 )']; |
| 117 |
%j=[j find( yc>-32.5 & xc<25 )']; |
| 118 |
j=[j find( xc>290 )']; |
| 119 |
j=[j find( xc<25 & xc>290-360 )']; |
| 120 |
j=[j find( yc>9 & yc<60 & (yc-9)+(xc-276)>0 )']; |
| 121 |
j=[j find( yc>9 & yc<60 & (yc-9)+(xc-276+360)>0 & xc<30 )']; |
| 122 |
j=[j find( yc>17 & yc<60 & xc>261 )']; |
| 123 |
j=[j find( yc>50 & (yc-70)-(xc-270)<0 )']; |
| 124 |
j=[j find( yc>31 & xc<38 & xc>-90 )']; |
| 125 |
j=[j find( yc>31 & xc>360-90 )']; |
| 126 |
j=[j find( yc>64 )']; |
| 127 |
matl=0*mskc; |
| 128 |
matl(j)=1; |
| 129 |
matl=matl.*mskc; |
| 130 |
GRID.mAtl=matl; |
| 131 |
|
| 132 |
j=[]; |
| 133 |
j=[j find( yc>-32.5 )']; |
| 134 |
matl=0*mskc; |
| 135 |
matl(j)=1; |
| 136 |
matl=GRID.mAtl.*matl.*mskc; |
| 137 |
GRID.matl=matl; |
| 138 |
|
| 139 |
mpac=(1-matl).*mskc; |
| 140 |
j=[]; |
| 141 |
j=[j find( yc<65 )']; |
| 142 |
mpac=0*mskc; |
| 143 |
mpac(j)=1; |
| 144 |
mpac=mpac.*mskc.*(1-GRID.mAtl); |
| 145 |
GRID.mPac=mpac; |
| 146 |
|
| 147 |
j=[]; |
| 148 |
j=[j find( yc>-32.5 )']; |
| 149 |
mpac=0*mskc; |
| 150 |
mpac(j)=1; |
| 151 |
mpac=GRID.mPac.*mpac.*mskc; |
| 152 |
GRID.mpac=mpac; |
| 153 |
|
| 154 |
msoc=(1-matl).*(1-mpac).*mskc; |
| 155 |
j=[]; |
| 156 |
j=[j find( yc<0 )']; |
| 157 |
GRID.msoc=msoc.*mskc.*(1-mpac).*(1-matl); |
| 158 |
|
| 159 |
function [A] = locrdmds(fname,errmsg) |
| 160 |
[fid,msg]=fopen([fname '.001.001.meta'],'r'); |
| 161 |
if fid == -1 |
| 162 |
A=[]; |
| 163 |
disp(errmsg); |
| 164 |
error(['The error occured while trying to open ' fname '.001.001.meta']) |
| 165 |
else |
| 166 |
fclose(fid); |
| 167 |
A=rdmds(fname); |
| 168 |
end |