Skip to content

Commit e810a56

Browse files
authored
Merge pull request #8 from gaelforget/AbstractArrayAsSupertype
Abstract array as supertype
2 parents fcb4bfa + ebf1223 commit e810a56

7 files changed

+297
-131
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "MeshArrays"
22
uuid = "28126448-9d44-11e8-08f5-e59c47736fcb"
33
authors = ["gaelforget <[email protected]>"]
4-
version = "0.1.4"
4+
version = "0.1.5"
55

66
[deps]
77
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"

src/MeshArrays.jl

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ include("gcmfaces_convert.jl");
1212
include("gcmfaces_IO.jl");
1313
include("gcmfaces_demo.jl");
1414

15-
export gcmfaces, exchange, gradient, convergence, smooth, mask, fsize
15+
export AbstractGcmfaces, gcmfaces, gcmsubset, fsize, fijind
16+
export exchange, gradient, convergence, smooth, mask
1617
export GCMGridSpec, GCMGridLoad, GCMGridOnes
1718
export demo1, demo2
1819
#The following functions rely on grid specs; currently via global vars.

src/gcmfaces_calc.jl

+11-11
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ end
99
function gradient(inFLD::gcmfaces,doDIV::Bool)
1010

1111
exFLD=exchange(inFLD,1)
12-
dFLDdx=gcmfaces(inFLD.nFaces,inFLD.grTopo)
13-
dFLDdy=gcmfaces(inFLD.nFaces,inFLD.grTopo)
12+
dFLDdx=similar(inFLD)
13+
dFLDdy=similar(inFLD)
1414

1515
for a=1:inFLD.nFaces;
1616
(s1,s2)=fsize(exFLD,a)
@@ -32,8 +32,8 @@ end
3232
function gradient(inFLD::gcmfaces,iDXC::gcmfaces,iDYC::gcmfaces)
3333

3434
exFLD=exchange(inFLD,1)
35-
dFLDdx=gcmfaces(inFLD.nFaces,inFLD.grTopo)
36-
dFLDdy=gcmfaces(inFLD.nFaces,inFLD.grTopo)
35+
dFLDdx=similar(inFLD)
36+
dFLDdy=similar(inFLD)
3737

3838
for a=1:inFLD.nFaces;
3939
(s1,s2)=fsize(exFLD,a)
@@ -55,7 +55,7 @@ return fldmsk
5555
end
5656

5757
function mask(fld::gcmfaces, val::Number)
58-
fldmsk=gcmfaces(fld.nFaces,fld.grTopo)
58+
fldmsk=similar(fld)
5959
for a=1:fld.nFaces
6060
tmp1=copy(fld.f[a])
6161
replace!(x -> !isfinite(x) ? val : x, tmp1 )
@@ -65,7 +65,7 @@ function mask(fld::gcmfaces, val::Number)
6565
end
6666

6767
function mask(fld::gcmfaces, val::Number, noval::Number)
68-
fldmsk=gcmfaces(fld.nFaces,fld.grTopo)
68+
fldmsk=similar(fld)
6969
for a=1:fld.nFaces
7070
tmp1=copy(fld.f[a])
7171
replace!(x -> x==noval ? val : x, tmp1 )
@@ -83,7 +83,7 @@ function convergence(uFLD::gcmfaces,vFLD::gcmfaces);
8383
# if otherwise then something this may be needed:
8484
# uFLD=mask(uFLD,0.0); vFLD=mask(vFLD,0.0);
8585

86-
CONV=gcmfaces(uFLD.nFaces,uFLD.grTopo)
86+
CONV=similar(uFLD)
8787

8888
(tmpU,tmpV)=exch_UV(uFLD,vFLD)
8989
for a=1:tmpU.nFaces
@@ -118,8 +118,8 @@ mskW=mask(mskW,0.0)
118118
mskS=mask(mskS,0.0)
119119

120120
#get inverse grid spacing:
121-
iDXC=gcmfaces(FLD.nFaces,FLD.grTopo)
122-
iDYC=gcmfaces(FLD.nFaces,FLD.grTopo)
121+
iDXC=similar(FLD)
122+
iDYC=similar(FLD)
123123
for a=1:FLD.nFaces;
124124
iDXC.f[a]=1.0./MeshArrays.DXC.f[a]
125125
iDYC.f[a]=1.0./MeshArrays.DYC.f[a]
@@ -147,8 +147,8 @@ dtFac=dt*mskC/MeshArrays.RAC;
147147
#loop:
148148
for it=1:nbt
149149
(dTdxAtU,dTdyAtV)=gradient(FLD,iDXC,iDYC);
150-
tmpU=gcmfaces(FLD.nFaces,FLD.grTopo)
151-
tmpV=gcmfaces(FLD.nFaces,FLD.grTopo)
150+
tmpU=similar(FLD)
151+
tmpV=similar(FLD)
152152
for a=1:FLD.nFaces
153153
tmpU.f[a]=dTdxAtU.f[a].*KuxFac.f[a];
154154
tmpV.f[a]=dTdyAtV.f[a].*KvyFac.f[a];

src/gcmfaces_convert.jl

+9-8
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,23 @@ return arr;
2323
end
2424

2525
## convert2array ##
26-
function convert2array(fld::Array)
26+
function convert2array(fld::Array{T,N}) where {T,N}
2727

2828
grTopo=MeshArrays.grTopo;
2929
nFaces=MeshArrays.nFaces;
3030

31-
v1=Array{Any,1}(undef,nFaces);
31+
v1=Array{Array{T,N},1}(undef,nFaces);
32+
N>2 ? error("N>2 case not implemented yet") : nothing
3233

3334
if MeshArrays.grTopo=="llc";
34-
(n1,n2)=MeshArrays.facesSize[1,:];
35+
(n1,n2)=MeshArrays.facesSize[1];
3536
v1[1]=fld[1:n1,1:n2];
3637
v1[2]=fld[n1+1:n1*2,1:n2];
3738
v1[3]=rotr90(fld[1:n1,n2+1:n2+n1]);
3839
v1[4]=rotl90(fld[n1*2+1:n1*3,1:n2]);
3940
v1[5]=rotl90(fld[n1*3+1:n1*4,1:n2]);
4041
elseif MeshArrays.grTopo=="cs";
41-
(n1,n2)=MeshArrays.facesSize[1,:];
42+
(n1,n2)=MeshArrays.facesSize[1];
4243
v1[1]=fld[1:n1,n1+1:n1+n2];
4344
v1[2]=fld[n1+1:2*n1,n1+1:n1+n2];
4445
v1[3]=rotr90(fld[1:n1,n1+n2+1:n2+n1*2]);
@@ -66,7 +67,7 @@ function convert2gcmfaces(fld::gcmfaces)
6667

6768
aa=0;bb=0;
6869
for iFace=1:nFaces;
69-
aa=aa+prod(facesSize[iFace,:]);
70+
aa=aa+prod(facesSize[iFace]);
7071
bb=bb+prod(size(fld.f[iFace]));
7172
end;
7273
n3=Int64(bb/aa);
@@ -75,8 +76,8 @@ function convert2gcmfaces(fld::gcmfaces)
7576
i0=0; i1=0;
7677
for iFace=1:nFaces;
7778
i0=i1+1;
78-
nn=facesSize[iFace,1];
79-
mm=facesSize[iFace,2];
79+
nn=facesSize[iFace][1];
80+
mm=facesSize[iFace][2];
8081
i1=i1+nn*mm;
8182
v11[i0:i1,:]=reshape(fld.f[iFace],(nn*mm,n3));
8283
end;
@@ -103,7 +104,7 @@ v1=Array{Array{eltype(fld),ndims(fld)}}(undef,nFaces);
103104
i0=0; i1=0;
104105
for iFace=1:nFaces
105106
i0=i1+1;
106-
nn=facesSize[iFace,1]; mm=facesSize[iFace,2];
107+
nn=facesSize[iFace][1]; mm=facesSize[iFace][2];
107108
i1=i1+nn*mm;
108109
if n3>1;
109110
v1[iFace]=reshape(v0[i0:i1,:],(nn,mm,n3));

src/gcmfaces_exch.jl

+8-8
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fillval=0.0
8181
#step 1
8282

8383
s=size.(fld.f);
84-
FLD=gcmfaces(1,"ll");
84+
FLD=similar(fld);
8585
FLD.f[1]=fill(fillval,s[1].+2N);
8686
@views FLD.f[1][N+1:N+s[1][1],N+1:N+s[1][2]]=fld.f[1];
8787

@@ -118,8 +118,8 @@ fillval=0.0
118118
#step 1
119119

120120
s=size.(fldU.f);
121-
FLDU=gcmfaces(1,"ll");
122-
FLDV=gcmfaces(1,"ll");
121+
FLDU=similar(fldU);
122+
FLDV=similar(fldV);
123123

124124
FLDU.f[1]=fill(fillval,s[1][1]+1,s[1][2]);
125125
FLDV.f[1]=fill(fillval,s[1][1],s[1][2]+1);
@@ -148,7 +148,7 @@ s=size.(fld.f);
148148
nf=fld.nFaces;
149149
nf==5 ? s=vcat(s,s[3]) : nothing
150150
tp=fld.grTopo;
151-
FLD=gcmfaces(nf,tp);
151+
FLD=similar(fld);
152152

153153
for i=1:nf; FLD.f[i]=fill(fillval,s[i].+2N); end;
154154
#code below yields strange, seemingly incorrect results:
@@ -196,8 +196,8 @@ s=size.(fldU.f);
196196
nf=fldU.nFaces;
197197
nf==5 ? s=vcat(s,s[3]) : nothing
198198
tp=fldU.grTopo;
199-
FLDU=gcmfaces(nf,tp);
200-
FLDV=gcmfaces(nf,tp);
199+
FLDU=similar(fldU);
200+
FLDV=similar(fldV);
201201

202202
for i=1:nf;
203203
FLDU.f[i]=fill(fillval,s[i].+2N);
@@ -250,8 +250,8 @@ s=size.(fldU.f);
250250
nf=fldU.nFaces;
251251
nf==5 ? s=vcat(s,s[3]) : nothing
252252
tp=fldU.grTopo;
253-
FLDU=gcmfaces(nf,tp);
254-
FLDV=gcmfaces(nf,tp);
253+
FLDU=similar(fldU);
254+
FLDV=similar(fldV);
255255

256256
for i=1:nf
257257
FLDU.f[i]=fill(fillval,s[i][1]+1,s[i][2]);

src/gcmfaces_grids.jl

+7-6
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ if gridName=="LLC90";
1414
nFaces=5;
1515
grTopo="llc";
1616
ioSize=[90 1170];
17-
facesSize=[[90 270];[90 270];[90 90];[270 90];[270 90]];
17+
facesSize=[(90, 270), (90, 270), (90, 90), (270, 90), (270, 90)]
1818
ioPrec=Float64;
1919
elseif gridName=="CS32";
2020
grDir="GRID_CS32/";
2121
nFaces=6;
2222
grTopo="cs";
2323
ioSize=[32 192];
24-
facesSize=[[32 32];[32 32];[32 32];[32 32];[32 32];[32 32]];
24+
facesSize=[(32, 32), (32, 32), (32, 32), (32, 32), (32, 32), (32, 32)]
2525
ioPrec=Float32;
2626
elseif gridName=="LL360";
2727
grDir="GRID_LL360/";
2828
nFaces=1;
2929
grTopo="ll";
3030
ioSize=[360 160];
31-
facesSize=[360 160];
31+
facesSize=[(360, 160)]
3232
ioPrec=Float32;
3333
else;
3434
error("unknown gridName case");
@@ -63,9 +63,10 @@ function GCMGridOnes(grTp,nF,nP)
6363
grDir=""
6464
grTopo=grTp
6565
nFaces=nF
66-
ioSize=[nP nP*nF];
67-
facesSize=fill(nP,(nF,2));
68-
ioPrec=Float32;
66+
ioSize=[nP nP*nF]
67+
facesSize=Array{NTuple{2, Int},1}(undef,nFaces)
68+
facesSize[:].=[(nP,nP)]
69+
ioPrec=Float32
6970

7071
list0=("XC","XG","YC","YG","RAC","RAZ","DXC","DXG","DYC","DYG","hFacC","hFacS","hFacW","Depth");
7172
for ii=1:length(list0);

0 commit comments

Comments
 (0)