API documentation
1. Data Structures
By default, the MeshArray type is an alias to MeshArrays.gcmarray.
MeshArrays.AbstractMeshArray — Type
AbstractMeshArray{T, N}Subtype of AbstractArray{T, N}
MeshArrays.gcmarray — Type
gcmarray{T, N, AT}gcmarray data structure. Available constructors:
gcmarray{T,N,AT}(grid::gcmgrid,meta::varmeta,f::Array{AT,N},
fSize::Array{NTuple{N, Int}},fIndex::Array{Int,1},v::String)
gcmarray(grid::gcmgrid,f::Array{Array{T,2},N}) where {T,N}
gcmarray(grid::gcmgrid,f::Array{Array{T,N},1}) where {T,N}
gcmarray(grid::gcmgrid,fSize::Array{NTuple{N, Int}},fIndex::Array{Int,1})
gcmarray(<same as above>,n3::Int)
gcmarray(<same as above>,n3::Int,n4::Int)
gcmarray(grid::gcmgrid)
gcmarray(grid::gcmgrid,::Type{T})
gcmarray(grid::gcmgrid,::Type{T},n3::Int)
gcmarray(grid::gcmgrid,::Type{T},n3::Int,n4::Int)
gcmarray(A::Array{T,N};meta::varmeta=defaultmeta)MeshArrays.gcmgrid — Type
gcmgridgcmgrid data structure. Available constructors:
gcmgrid(path::String, class::String, nFaces::Int,
fSize::Array{NTuple{2, Int},1},
ioSize::Union{NTuple{2, Int},Array{Int64,2}},
ioPrec::Type, read::Function, write::Function)The class can be set to "LatLonCap", "CubeSphere", "PeriodicChannel", "PeriodicDomain".
For example, A periodic channel (periodic in the x direction) of size 360 by 160, can be defined as follows.
path=MeshArrays.Dataset("GRID_LL360")
class="PeriodicChannel"
ioSize=(360, 160)
ioPrec=Float32
γ=gcmgrid(path, class, 1, [ioSize], ioSize, ioPrec, read, write)
Γ=GridLoad(γ) Please refer to GridSpec and UnitGrid for more info related to gcmgrid options.
MeshArrays.varmeta — Type
varmetavarmeta data structure. By default, unit is missing (non-dimensional), position is fill(0.5,3) (cell center), time is missing, and name / long_name is unknown.
Available constructors:
varmeta(unit::Union{Unitful.Units,Number,Missing},position::Array{Float64,1},
time::Union{DateTime,Missing,Array{DateTime,1}},name::String,long_name::String)And:
defaultmeta = varmeta(missing,fill(0.5,3),missing,"unknown","unknown")
MeshArrays.gridpath — Type
gridpathgridpath data structure.
path=MeshArrays.Dataset("GRID_LLC90")
γ=GridSpec("LatLonCap",path)
Γ=GridLoad(γ;option="light")
lons=[-68 -63]; lats=[-54 -66]; name="Drake Passage"
Trsct=Transect(name,lons,lats,Γ)MeshArrays.gridmask — Type
gridmaskgridmask data structure.
G,M,files=Integration.example()
MInternals
MeshArrays.InnerArray — Type
InnerArray{T,N}2D array holding data for a single mesh face (tile). Stored as elements of an OuterArray.
MeshArrays.OuterArray — Type
OuterArray{T,N}Array that organises mesh faces across dimensions: [face], [face, k], or [face, k, l]. Each element is an InnerArray holding data for one face.
More
MeshArrays.gcmvector — Type
gcmvector{T, N}gcmvector data structure that can be used for subsetting and indexing into a gcmarray.
gcmvector{T,N}(grid::gcmgrid,f::Array{Array{T,1},N},
fSize::Array{NTuple{N, Int}},fIndex::Array{Int,1})
MeshArrays.gcmfaces — Type
gcmfaces{T, N}gcmfaces data structure. Available constructors:
gcmfaces{T,N}(grid::gcmgrid,f::Array{Array{T,N},1},
fSize::Array{NTuple{N, Int}}, aSize::NTuple{N,Int})
gcmfaces(grid::gcmgrid,v1::Array{Array{T,N},1}) where {T,N}
gcmfaces(grid::gcmgrid,::Type{T},
fSize::Array{NTuple{N, Int}}, aSize::NTuple{N,Int}) where {T,N}
gcmfaces(grid::gcmgrid)
gcmfaces(grid::gcmgrid,::Type{T})
gcmfaces(grid::gcmgrid,::Type{T},n3::Int)2. Grids And I/O
Grid definitions :
MeshArrays.GridSpec — Function
GridSpec(category="default",
path=tempname(); np=nothing, ID=:unknown)- Select one of the pre-defined grids
- either by
categoryparameter (e.g. "default" or "ones") - or by
IDkeyword viaMeshArrays.GridSpec_defaultorMeshArrays.GridSpec_MITgcm)
- either by
- Return the corresponding
gcmgrid- including in
patheither a path to grid files or a placeholder like_onesor_default.
- including in
using MeshArrays
γ=GridSpec()MeshArrays.GridSpec_default — Function
GridSpec_default(xy=NamedTuple(); ID=:unknown, ioPrec=Float64, tile=[])- Select one of the pre-defined grids
- or by providing
xyparameter (aNamedTuplethat includes:xc, :yc, :xg, :yg) - either by
IDkeyword (e.g.,:OISST,:Oscar, or:IAPby default)
- or by providing
- Return the corresponding
gcmgrid- incl.
path="_default"
- incl.
Example:
using MeshArrays
a = MeshArrays.GridSpec_default(ID=:OISST)
b = MeshArrays.GridSpec_default(MeshArrays.Grids_simple.xy_OISST(),tile=(1440,1020))
c = MeshArrays.GridSpec_default(MeshArrays.Grids_simple.xy_OISST(),tile=(720,510))MeshArrays.GridSpec_MITgcm — Function
GridSpec_MITgcm(category="PeriodicDomain",
path=tempname(); np=nothing, ID=:unknown)- Select one of the pre-defined grids
- or by
categoryparameter - either by
IDkeyword
- or by
- Return the corresponding
gcmgrid- incl. path to grid files (
path).
- incl. path to grid files (
Input files for these fully supported grids get downloaded internally via MeshArrays.Dataset if needed.
- selection by
ID
:onedegree:LLC90:LLC270:CS32:default
Example:
using MeshArrays
g = GridSpec(ID=:LLC90)- by
categoryandpath
"PeriodicDomain"(default)"PeriodicChannel""CubeSphere""LatLonCap"`
Examples:
using MeshArrays
g = GridSpec("CubeSphere",MeshArrays.Dataset("GRID_CS32"),ioPrec=Float32)
isa(g,gcmgrid)When the np keyword argument is specified then it is used to set the number of points in each grid subdomain.
Example:
using MeshArrays
g = GridSpec("LatLonCap",np=270)
isa(g,gcmgrid)MeshArrays.Grids_simple.GridSpec_ones — Function
GridSpec_ones(grTp; ioPrec=Float64,nP=10,nF=1)Define grid where all variables will be set to one via GridLoad_ones.
- Possible values for
grTp` : "LatLonCap","CubeSphere","PeriodicChannel","PeriodicDomain". nP: number of points at each subdomain edge.nF(only for "PeriodicChannel", "PeriodicDomain" grids) : number of subdomains.
using MeshArrays
γ=MeshArrays.GridSpec_ones("CubeSphere")
Γ=MeshArrays.GridLoad_ones(γ;option="full")Read / write methods :
Base.read — Function
read(fil::String,x::AbstractMeshArray)Read array from file and return as a MeshArray.
The second argument (MeshArray or gcmgrid) provides the grid specifications (x.grid.ioSize). ```
read(xx::Array,γ::gcmgrid)Reformat Array data into a MeshArray shaped after γ.
read(xx::Array,x::AbstractMeshArray)Reformat Array data into a MeshArray similar to x.
Base.read! — Function
read!(fil::String, y::AbstractMeshArray)Read binary file fil into pre-allocated MeshArray y (in-place, no allocation).
read!(xx::Array,x::AbstractMeshArray)Reformat array into MeshArray and write into x.
Base.write — Function
write(fil::String,x::AbstractMeshArray)Write MeshArray to binary file. Other methods:
write(xx::Array,x::AbstractMeshArray) #to ArrayLoading grids :
MeshArrays.GridLoad — Function
GridLoad(γ=GridSpec(); ID=:default, option=:minimal, verbose=false)- Return a
NamedTupleof grid variables read from files located inγ.path(see?GridSpec). - if
IDis specified then callGridSpec(ID=ID)to overrideγparameter. - option :
- option=:minimal (default) to get only grid cell center positions (XC, YC).
- option=:light to get a complete set of 2D grid variables.
- option=:full to get a complete set of 2D & 3D grid variables.
For grid variables, we follow the MITgcm naming convention. Grid variables thus typically include :
- XC, XG, YC, YG, AngleCS, AngleSN, Depth
- RAC, RAW, RAS, RAZ, DXC, DXG, DYC, DYG
- three-dimensional : hFacC, hFacS, hFacW
- one-dimensional : DRC, DRF, RC, RF
For additional detail please refer to the MITgcm documentation :
https://mitgcm.readthedocs.io/en/latest/algorithm/algorithm.html#spatial-discretization-of-the-dynamical-equations
using MeshArrays
γ = GridSpec(ID=:LLC90)
Γ = GridLoad(γ;option="full")
isa(Γ.XC,MeshArray)MeshArrays.GridLoad_default — Function
GridLoad_default(γ=GridSpec())MeshArrays.GridSpec_default(ID=:IAP)MeshArrays.Grids_simple.GridLoad_ones — Function
GridLoad_ones(γ::gcmgrid;option="minimal")Generate a unit grid, where every grid spacing and area is 1, as specified by γ obtained from GridSpec_ones.
using MeshArrays
γ=MeshArrays.GridSpec_ones("CubeSphere",6,20)
Γ=MeshArrays.GridLoad_ones(γ;option="full")MeshArrays.GridLoadVar — Function
GridLoadVar(nam::String,γ::gcmgrid)Return a grid variable read from files located in γ.path (see ?GridSpec, ?GridLoad).
Based on the MITgcm naming convention, grid variables are:
- XC, XG, YC, YG, AngleCS, AngleSN, hFacC, hFacS, hFacW, Depth.
- RAC, RAW, RAS, RAZ, DXC, DXG, DYC, DYG.
- DRC, DRF, RC, RF (one-dimensional)
MITgcm documentation :
https://mitgcm.readthedocs.io/en/latest/algorithm/algorithm.html#spatial-discretization-of-the-dynamical-equations
using MeshArrays
γ = GridSpec("CubeSphere",MeshArrays.Dataset("GRID_CS32"),ioPrec=Float32)
XC = GridLoadVar("XC",γ)
isa(XC,MeshArray)Functionalities
MeshArrays.Tiles — Function
Tiles(γ::gcmgrid,ni::Int,nj::Int)Define sudomain tiles of size ni,nj. Each tile is defined by a Dict where tile,face,i,j correspond to tile ID, face ID, index ranges.
using MeshArrays
γ=GridSpec("LatLonCap",MeshArrays.Dataset("GRID_LLC90"))
τ=Tiles(γ,30,30)
isa(τ[1],NamedTuple)Tiles(τ::Array{Dict},x::AbstractMeshArray)Return an Array of tiles which cover x according to tile partition τ.
using MeshArrays
γ=GridSpec(ID=:LLC90)
d=MeshArray(γ,γ.ioPrec)
f=joinpath(γ.path,"Depth.data")
read!(f,d)
τ=Tiles(γ,30,30)
td=Tiles(τ,d)
D=similar(d)
Tiles!(τ,td,D)
isa(td[1],Array)MeshArrays.Tiles! — Function
Tiles!(τ::Array,tx::Array,x::AbstractMeshArray)Map tiles in tx according to tile partition τ into x.
MeshArrays.exchange — Function
exchange(fld::AbstractMeshArray)Exchange / transfer data between neighboring arrays. Other methods are
exchange(fld::AbstractMeshArray,N::Integer)
exchange(u::AbstractMeshArray,v::AbstractMeshArray)
exchange(u::AbstractMeshArray,v::AbstractMeshArray,N::Integer)3. Interpolation
MeshArrays.interpolation_setup — Function
interpolation_setup(fil::String)Read e.g. interp_coeffs_halfdeg.jld2
fil=joinpath(tempdir(),"interp_coeffs_halfdeg.jld2")
λ=MeshArrays.interpolation_setup(fil) interpolation_setup(γ::gcmgrid)Download/read precomputed interpolation coefficients for gcmgrid γ if they exist, currently for LLC90 and LLC270, otherwise compute interpolation coefficients defaulting to 2° grid.
interpolation_setup(;Γ,lon,lat,filename)Download or recompute interpolation coefficients.
λ=interpolation_setup()to download "interpcoeffshalfdeg.jld2"λ=interpolation_setup(Γ=Γ)to recompute interpolation tolon,latλ=interpolation_setup(Γ=Γ,lon=lon,lat=lat,filename=filename)to recompute interpolation tolon,latand save to location and filefilename, defaulting totempname()*"_interp_coeffs.jld2".
MeshArrays.Interpolate — Function
Interpolate(z_in::AbstractMeshArray,f,i,j,w)using MeshArrays
path=MeshArrays.Dataset("GRID_LLC90")
γ=GridSpec("LatLonCap",path)
Γ=GridLoad(γ; option="full")
lon=[i for i=-179.5:1.0:179.5, j=-89.5:1.0:89.5]
lat=[j for i=-179.5:1.0:179.5, j=-89.5:1.0:89.5]
(f,i,j,w,j_f,j_x,j_y)=InterpolationFactors(Γ,vec(lon),vec(lat))
DD=Interpolate(Γ.Depth,f,i,j,w)
using CairoMakie
heatmap(vec(lon[:,1]),vec(lat[1,:]),DD,colorrange=(0.,6000.))Interpolate(z_in::AbstractMeshArray,f,i,j,w)using MeshArrays
path=MeshArrays.Dataset("GRID_LLC90")
γ=GridSpec("LatLonCap",path)
Γ=GridLoad(γ; option="full")
lon=[i for i=-179.5:1.0:179.5, j=-89.5:1.0:89.5]
lat=[j for i=-179.5:1.0:179.5, j=-89.5:1.0:89.5]
(f,i,j,w,j_f,j_x,j_y)=InterpolationFactors(Γ,vec(lon),vec(lat))
L=(lon=lon, lat=lat, f=f, i=i, j=j, w=w)
using CairoMakie
heatmap(Interpolate(Γ.Depth,L)...,colorrange=(0.,6000.))or
heatmap(Γ.Depth,interpolation=L,colorrange=(0.,6000.))MeshArrays.InterpolationFactors — Function
InterpolationFactors(Γ,lon::Array{T,1},lat::Array{T,1})Compute interpolation coefficients etc from grid Γ to lon,lat
using MeshArrays
path=MeshArrays.Dataset("GRID_CS32")
γ=GridSpec("CubeSphere",path,ioPrec=Float32)
Γ=GridLoad(γ; option="full")
lon=collect(45.:0.1:46.); lat=collect(60.:0.1:61.)
(f,i,j,w,j_f,j_x,j_y)=InterpolationFactors(Γ,lon,lat)
YC=Interpolate(Γ.YC,f,i,j,w)
extrema(i)==(9,10)NearestNeighbors.knn — Function
knn(xgrid,ygrid::AbstractMeshArray,x,y::Array{T,1},k::Int)Find k nearest neighbors to each point in x,y on xgrid,ygrid
lon=collect(0.1:0.5:2.1); lat=collect(0.1:0.5:2.1)
(f,i,j,c)=knn(Γ.XC,Γ.YC,lon,lat)MeshArrays.StereographicProjection — Function
StereographicProjection(XC0,YC0,XC,YC)Apply stereographic projection that puts XC0,YC0 at 0.0,0.0 to target point(s) XC,YC
lon=collect(45.:0.1:46.); lat=collect(60.:0.1:61.)
x,y=StereographicProjection(45.,60.,lon,lat)4. Vector Fields
MeshArrays.curl — Function
curl(u::AbstractMeshArray,v::AbstractMeshArray,Γ::NamedTuple)Compute curl of a velocity field.
MeshArrays.convergence — Function
convergence(uFLD::AbstractMeshArray,vFLD::AbstractMeshArray)Compute convergence of a vector field
MeshArrays.gradient — Function
gradient(inFLD::AbstractMeshArray,Γ::NamedTuple)Compute spatial derivatives. Other methods:
gradient(inFLD::AbstractMeshArray,Γ::NamedTuple,doDIV::Bool)
gradient(inFLD::AbstractMeshArray,iDXC::AbstractMeshArray,iDYC::AbstractMeshArray)MeshArrays.ScalarPotential — Function
ScalarPotential(TrspCon)Scalar potential inversion.
TrspPot=ScalarPotential(TrspCon)MeshArrays.VectorPotential — Function
VectorPotential(TrspX,TrspY,Γ,method::Int=1)Vector potential inversion.
TrspPot=ScalarPotential(TrspCon)MeshArrays.ThroughFlow — Function
ThroughFlow(VectorField,IntegralPath,Γ::NamedTuple)Compute transport through an integration path
MeshArrays.UVtoTransport — Function
UVtoTransport(U,V,G::NamedTuple)Convert e.g. velocity (m/s) to transport (m^3/s) by multiplying by DRF and DXG,DYG.
MeshArrays.UVtoUEVN — Function
UVtoUEVN(u,v,G::NamedTuple)- Interpolate to grid cell centers (uC,vC)
- Convert to
Eastward/Northwardcomponents (uE,vN)
Note: land masking u,v with NaNs preemptively can be adequate.
MeshArrays.EkmanTrsp — Function
EkmanTrsp(u::AbstractMeshArray,v::AbstractMeshArray,Γ::NamedTuple)Compute Ekman Transport (in m2/s) from wind stress (in N/m2 , or kg/m/s2).
MeshArrays.calc_bolus — Function
compute bolus velocty field (bolusU,bolusV,bolusW) from gm streamfunction (GMPsiX,GMPsiY)
Integration Paths
MeshArrays.LatitudeCircles — Function
LatitudeCircles(LatValues,Γ::NamedTuple; format=:gridpath, range=(0.0,360.0))Compute integration paths that follow latitude circles, within the specified longitude range.
MeshArrays.LatitudeCircle — Function
LatitudeCircle(lat,Γ::NamedTuple; format=:gridpath, range=(0.0,360.0))Compute the integration path along a single latitude circle at lat degrees. Returns a gridpath by default, or a NamedTuple with fields lat, name, grid, C, W, S when format=:NamedTuple.
MeshArrays.Transect — Function
Transect(name,lons,lats,Γ; segment=:short, format=:gridpath)Compute integration paths that follow a great circle between two geolocations give by lons, lats.
MeshArrays.edge_path — Function
edge_path(name,mskCint,Γ)Compute integration path that follows the outer edge of mskCint>0.
Γ=GridLoad(ID=:LLC90)
mask=demo.extended_basin(demo.ocean_basins(),:Pac)
edge=edge_path("Pacific Ocean Edge",mask,Γ)MeshArrays.edge_mask — Function
edge_mask(mskCint::AbstractMeshArray)Compute edge mask (mskC,mskW,mskS) from domain interior mask (mskCint). This is used in LatitudeCircles and Transect.
5. Integration Loop
MeshArrays.Integration.loops — Function
loops(mask::gridmask; files=String[], var=:THETA, rd=read)begin
@everywhere using MeshArrays, MITgcm
@everywhere rd(F,var,tim,tmp)=read(read_mdsio(F,var),tmp)
@everywhere G,M,files=Integration.example()
#,regions=(30,10),depths=Integration.DEPTHS)
end
H=Integration.loops(M,files=files,rd=rd)
# Hbis=Integration.streamlined_loop(M,files=files,rd=rd)and to save results:
using JLD2; output_path="test.jld2"
jldsave(output_path; depths=M.depths, integral=H, volume=vol, name=M.names)where vol is calculated as follows:
#option=:loops
allones=1.0 .+0*G.hFacC
M.tmp2d.=M.v_int[1](allones)
vol=[b(M.tmp2d) for b in M.h_sum]or
#option=:streamlined_loop
allones=1.0 .+0*G.hFacC
vol=[b(allones) for b in M.h_sum]MeshArrays.Integration.streamlined_loop — Function
streamlined_loop(mask::gridmask; files=String[], var=:THETA, rd=read)Alternate approach to loops, where loops are streamlined in a single dimension.
MeshArrays.Integration.define_regions — Function
define_regions(;option=:global,grid::NamedTuple)Define regional integration mask (one value period region).
MeshArrays.Integration.define_sums — Function
define_sums(;option=:loops, grid::NamedTuple, regions=:global, depths=[(0,7000)])Define regional integration function for each basin and depth range.
6. Grid Data Sets
MeshArrays.Dataset — Function
Dataset(d::String; do_read=true, verbose=false)- get folder name for dataset
d. - download dataset if needed.
- read content if
do_read
Internals
MeshArrays.mydatadep — Function
mydatadep(nam="countries_shp1")Download data dependency with predefined name; currently :
"countries_shp1"
"countries_geojson1"
"basemap_jpg1"
"interp_halfdeg"
"interp_quarterdeg"
"oceans_geojson1"7. Polygons
MeshArrays.within_pol — Function
within_pol(pol; ID=1)Generate a name,rule pair to test if location lon,lat is within polygon pol[ID].geometry.
using MeshArrays, DataDeps, GeoJSON, GeometryOps
fil=MeshArrays.Dataset("oceans_geojson1",do_read=false)
pol=MeshArrays.read_json(fil,format=:GeoJSON)
name,rule=MeshArrays.within_pol(pol; ID=11)
rule(-30,40)MeshArrays.read_json — Function
read_json(fil; format=:polyarray)Call GeoJSON.read and return polyarray (default)
- format
:polyarray(default): returnpolyarray` - format
:coord: convert toGI.coordinates. - format
:GeoJSON: return FeatureCollection (vector of name,geom pairs)
import MeshArrays, DataDeps, GeoJSON
pol=MeshArrays.Dataset("oceans_geojson1")MeshArrays.read_shp — Function
read_shp(fil; format=:polyarray)Call Shapefile.Table and Shapefile.shapes and return polyarray (default).
- format
:polyarray(default) : returnpolyarray - format
:Shapefile: return vector ofname,geometry` named tuples. - format
:coord: convert toGI.coordinates.
using MeshArrays, DataDeps, Shapefile
fil=MeshArrays.Dataset("countries_shp1")
using CairoMakie
lines(pol)MeshArrays.NamedPolygon — Type
struct NamedPolygon geometry::Vector{Tuple{Float32, Float32}} name::String points::Vector{} end
MeshArrays.polyarray — Type
struct polyarray name::String f::Array{NamedPolygon} end
using MeshArrays, GeoJSON, DataDeps
pol=MeshArrays.Dataset("oceans_geojson1")
write(pol,tempname()*".json")
using CairoMakie
lines(pol)MeshArrays.to_Polygon — Function
to_Polygon(pa::polyarray)Convert polyarray into a GI.Polygon array.
pol_P,nams=MeshArrays.to_Polygon(pol)MeshArrays.to_polyarray — Function
to_polyarray(pol)Convert polygon data into a polyarray.
fil="countries.geojson"
MeshArrays.to_polyarray(GeoJSON.read(fil))8. Other
MeshArrays.isosurface — Function
isosurface(θ,T,Γ)Depth of isosurface θ=T
MeshArrays.land_mask — Function
land_mask(m::AbstractMeshArray)Define land mask from m (1 if m>0; NaN if otherwise).
MeshArrays.demo.ocean_basins — Function
ocean_basins()Mask of ocean basins on ECCO grid (LLC90).
basins=demo.ocean_basins()
AtlExt=extended_basin(basins,:Atl)MeshArrays.demo.extended_basin — Function
extended_basin(basins,ID=:Atl)Consolidate basins mask to include marginal seas.
note : has only be tested on the ECCO grid (LLC90).
basins=demo.ocean_basins()
AtlExt=extended_basin(basins,:Atl)Masked Array Utilities
MeshArrays.nansum — Function
Sum of non-NaN elements; nansum(x,dim) reduces along dimension dim.
MeshArrays.nanmean — Function
Mean of non-NaN elements; nanmean(x,dim) reduces along dimension dim. Two-argument scalar form returns the mean of the two values, treating NaN as missing.
MeshArrays.nanmax — Function
Maximum of non-NaN elements; nanmax(x,dim) reduces along dimension dim.
MeshArrays.nanmin — Function
Minimum of non-NaN elements; nanmin(x,dim) reduces along dimension dim.