source: TOOLS/MOSAIX/CreateWeightsMask.bash @ 5925

Last change on this file since 5925 was 5925, checked in by snguyen, 3 years ago

Ajout du notebook de génération du fichier coordonnées masks bounds en python

  • Property svn:executable set to *
  • Property svn:keywords set to Date Revision HeadURL Author Id
File size: 48.7 KB
Line 
1#!/bin/bash
2#MSUB -r WeightsMask        # Job name
3#MSUB -o Out_WeightsMask    # Standard output
4#MSUB -e Out_WeightsMask    # Error output
5#MSUB -n 4                  # Number of processors
6##MSUB -T 7200               # Time limit (seconds)
7#MSUB -T 1800
8#MSUB -Q test
9#MSUB -q skylake
10#MSUB -p gen2212
11#MSUB -m work,store
12
13### ===========================================================================
14###
15### Creates interpolation weights between ORCA and atmosphere grids.
16### Interpolates ORCA mask to atmosphere grid.
17### Weight files are at OASIS-MCT format.
18###
19### Atmosphere grid may be lon/lat LMDZ or DYNAMICO icosahedron
20###
21### Documentation : https://forge.ipsl.jussieu.fr/igcmg/wiki/IPSLCM6/MOSAIX
22### ===========================================================================
23##
24##  Warning, to install, configure, run, use any of Olivier Marti's
25##  software or to read the associated documentation you'll need at least
26##  one (1) brain in a reasonably working order. Lack of this implement
27##  will void any warranties (either express or implied).
28##  O. Marti assumes no responsability for errors, omissions,
29##  data loss, or any other consequences caused directly or indirectly by
30##  the usage of his software by incorrectly or partially configured
31##  personal.
32##
33## SVN information
34#  $Author$
35#  $Date$
36#  $Revision$
37#  $Id$
38#  $HeadURL$
39#
40# CplModel=eORCA1.2xLMD144142 ; qsub -r ${CplModel} -o Out_${CplModel} -e Out_${CplModel} CreateWeightsMask.bash
41# CplModel=ORCA2.3xLMD9695
42# CplModel=ORCA2.3xICO30
43# CplModel=ORCA2.3xICO40
44# CplModel=eORCA1.2xICO40
45# CplModel=eORCA1.2xICO450
46# CplModel=eORCA1.2xLMD256256
47# CplModel=eORCA025.1xLMD144142
48# CplModel=eORCA025.1xLMD256256
49#
50
51set +vx
52export Bold=$(tput bold) 
53export Unde=$(tput smul) ; export OffUnde=$(tput rmul)
54export Stou=$(tput smso) ; export OffStou=$(tput rmso)
55export Reve=$(tput rev ) 
56couleurs=( "Black" "Blue" "Green" "Cyan" "Red" "Magenta" "Yellow" "White" )
57for i in $(seq 0 7) ; do eval "export ${couleurs[$i]}=$(tput setf ${i})" ; done
58export Norm=$(tput sgr0)
59export Titre=${Bold}${Blue}
60
61##
62## Configuration
63## ===========================================================================
64set -e
65echo BASH Version ${BASH_VERSION}
66echo SHELL ${SHELL}
67
68#
69echo ${Titre}"Defines model"${Norm}
70# =================================
71CplModel=ORCA2.3xLMD9695
72#CplModel=ORCA2.3xICO30
73#CplModel=ORCA2.3xICO40
74#CplModel=eORCA1.2xLMD144142
75#CplModel=eORCA1.2xLMD256256
76#CplModel=eORCA1.2xICO40
77#CplModel=eORCA1.2xICO450
78#CplModel=eORCA025.1xLMD256256
79
80#Version="v0" ; Comment="Fully tested in IPSLCM6 eORCA1.2 x LMD 144x142"
81Version="v1" ; Comment="Fully tested in IPSLCM6 eORCA1.2 x LMD 144x142"
82
83# If available, get model name from job name
84if [[ X${SLURM_JOB_NAME} = X*ORC* ||  X${SLURM_JOB_NAME} = X*LMD*  ||  X${SLURM_JOB_NAME} = X*ICO* ]] ; then
85    CplModel=${SLURM_JOB_NAME} ;
86fi
87OCE=${CplModel//x*} ; ATM=${CplModel##*x}
88
89echo ${Titre}"ATM model : ${ATM}"${Norm}
90echo ${Titre}"OCE model : ${OCE}"${Norm}
91echo ${Titre}"Cpl model : ${CplModel}"${Norm}
92echo ${Titre}"Version   : ${Version}"${Norm}
93
94# Runoff parameter. atmCoastWidth and oceCoastWidth in grid points, searchRadius in km
95atmCoastWidth=2 ; oceCoastWidth=2 ; searchRadius=550.0
96runOff_atmQuantity=Quantity ; runOff_oceQuantity=Surfacic
97
98# Specific cases
99[[ ${ATM} = ICO*      ]] && atmCoastWidth=0 # Parameter relevant for LMD rectilinear grid only
100[[ ${ATM} = LMD*      ]] && atmCoastWidth=2
101[[ ${OCE} = ORCA2.*   ]] && oceCoastWidth=1
102[[ ${OCE} = eORCA1.*  ]] && oceCoastWidth=2
103[[ ${OCE} = eORCA025* ]] && oceCoastWidth=1
104
105# More specific cases
106[[ ${CplModel} = eORCA1.2xLMD144142 ]] && { atmCoastWidth=2 ; oceCoastWidth=2 ; searchRadius=550.0 ; Version="v1" ; Comment="Fully tested in IPSLCM6 eORCA1.2 x LMD 144x142" ; }
107
108# Default values, used to create ocean fraction on atmospheric grid
109DefaultValues=( Direction=o2a,oceGrid=t,atmGrid=t,Order=1st,Quantity=false,Renormalize=false,useArea=false,maskSrc=true,maskDst=false,Name=OceFrac )
110
111## List of weights to build
112## ====================================================================================================================================
113#
114# Each item in CommandList describes the properties of interpolation weights to generate.
115# White spaces separate analysis. No spaces in any analysis.
116#
117# Specific commands : 'Runoff', 'Calving'
118#
119# Keywords :
120#   Direction   : o2a for ocean to atmosphere, a2o for atmosphere to ocean.
121#   Order       : 1st or 2nd.
122#   Quantity    : true if integrated quantity over a grid box, false for flux (quantity / m^2)
123#                 or intensive value (temperature, salinity, sea-ice fraction, ...).
124#   Renormalize : used when source grid is masked, to use values on non masked points only.
125#   oceGrid     : t, u or v point for NEMO C grid.
126#   atmGrid     : up to know, only t grid used in the atmosphere.
127#   useArea     : if true area from the model metrics is used. If false, areas are computed by XIOS from grid corners.
128#   maskSrc     : true to use the source grid mask, false to used all grid points.
129#   maskDst     : true to use the destination grid mask, false to use all grid points.
130#
131## Classic cases for IPSLCM6
132AtmOceFluxes="   Direction=a2o,Order=1st,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=t,useArea=true,maskSrc=true,maskDst=true,Name=HeatWaterFluxes" # Heat and water fluxes
133OceAtmTemp="     Direction=o2a,Order=1st,Quantity=false,Renormalize=true,oceGrid=t,atmGrid=t,useArea=false,maskSrc=true,maskDst=true,Name=TempIceAlb"      # Temperature, sea-ice fraction, albedo
134OceAtmTemp2nd="  Direction=o2a,Order=2nd,Quantity=false,Renormalize=true,oceGrid=t,atmGrid=t,useArea=false,maskSrc=true,maskDst=true,Name=TempIceAlb"      # Temperature, sea-ice fraction, albedo
135AtmOceStressU="  Direction=a2o,Order=2nd,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=u,useArea=true,maskSrc=true,maskDst=true,Name=WindStress"      # Wind stress to NEMO U point
136AtmOceStressV="  Direction=a2o,Order=2nd,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=v,useArea=true,maskSrc=true,maskDst=true,Name=WindStress"      # Wind stress to NEMO V point
137AtmOceQuantity=" Direction=a2o,Order=1st,Quantity=true,Renormalize=false,atmGrid=t,oceGrid=t,useArea=false,maskSrc=true,maskDst=true,Name=Quantity"        # e.g. runoff
138# For new parameterization
139AtmOceTemp="     Direction=o2a,Order=1st,Quantity=false,Renormalize=true,oceGrid=t,atmGrid=t,useArea=false,maskSrc=true,maskDst=true,Name=OceTemp" # e.g. T and S correction from DWL parametrization
140OceAtmFluxes="   Direction=o2a,Order=1st,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=t,useArea=true,maskSrc=true,maskDst=true,Name=OceAtmFluxes" # e.g. CO2 fluxes
141# Test to do with 2nd order
142AtmOceFluxes2nd="Direction=a2o,Order=2nd,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=t,useArea=true,maskSrc=true,maskDst=true,Name=HeatWaterFluxes" # Heat and water fluxes
143OceAtmFluxes2nd="Direction=o2a,Order=2nd,Quantity=false,Renormalize=false,atmGrid=t,oceGrid=t,useArea=true,maskSrc=true,maskDst=true,Name=OceAtmFluxes" # e.g. CO2 fluxes
144AtmOceTemp2nd="  Direction=o2a,Order=2nd,Quantity=false,Renormalize=true,oceGrid=t,atmGrid=t,useArea=false,maskSrc=true,maskDst=true,Name=OceTemp" # e.g. T and S correction from DWL parametrization
145
146## Creates the list
147
148# Standard list for IPSLCM6
149#CommandList=( ${AtmOceFluxes} ${OceAtmTemp} ${AtmOceStressU} ${AtmOceStressV} ${OceAtmFluxes} Runoff Calving Grids )
150
151# More comprehensive list for IPSLCM6 with new features
152#CommandList=( ${AtmOceFluxes} ${OceAtmTemp} ${AtmOceStressU} ${AtmOceStressV} ${OceAtmFluxes} ${AtmOceTemp} Runoff Calving Grids )
153
154# With 2nd order
155CommandList=( ${AtmOceFluxes} ${AtmOceFluxes2nd} ${OceAtmTemp} ${OceAtmTemp2nd} ${AtmOceStressU} ${AtmOceStressV} ${OceAtmFluxes} ${OceAtmFluxes2nd} ${AtmOceTemp} ${AtmOceTemp2nd} Runoff Calving Grids )
156
157# Debugs
158#CommandList=( ${AtmOceFluxes} ${OceAtmTemp} Runoff Calving Grids )
159#CommandList=( ${AtmOceFluxes} Runoff Calving Grids )
160#CommandList=( ${AtmOceFluxes} ${OceAtmTemp} )
161#CommandList=( ${AtmOceFluxes} )
162#CommandList=( Runoff )
163#CommandList=( Runoff Calving Grids )
164#CommandList=( Calving )
165#CommandList=( Grids )
166
167if [[ ${Version} = test_runoff_* ]] ; then
168    CommandList=( Runoff )
169fi
170
171## ===========================================================================
172##
173## You should not change anything below this line ....
174##
175## ===========================================================================
176Tag="MOSAIX"
177SUBMIT_DIR=$(pwd)
178FMT_XIOS=netcdf4
179
180# Functions to handle command parameters
181# ======================================
182function read_Command {
183    # Decipher the command line to set bash variables
184    local l_Debug="no" l_Element
185    while [[ ${1} = -* ]] ; do
186        case ${1} in
187            ( -- ) shift ; break ;;
188            ( -d | --debug ) l_Debug="true" ; shift ;;
189        esac
190    done
191    local l_Command=${1}
192    for l_Element in $(echo ${l_Command} | tr "," "\n" ) ; do
193        [[ "X${l_Debug}" = "Xtrue" ]] && echo ${l_Element}
194        eval export ${l_Element}
195    done
196}
197
198function setValues {
199    # Set default values
200    read_Command "Direction=None,Order=None,Quantity=None,Renormalize=None,atmGrid=None,oceGrid=None,useArea=None,maskSrc=None,maskDst=None"
201    # Read command line
202    read_Command ${1}
203    #
204    oceGrid=${oceGrid,,} ; atmGrid=${atmGrid,,} # Model names to lower case
205    OCEGRID=${oceGrid^^} ; ATMGRID=${atmGrid^^} # Model names to upper case
206
207    case ${Order} in
208        ( 1st ) numOrder=1 ;;
209        ( 2nd ) numOrder=2 ;;
210    esac
211    case ${Renormalize} in
212        ( true )  NormName=Normalized   ;;
213        ( false ) NormName=UnNormalized ;;
214    esac
215    case ${Quantity} in
216        ( true )  QuantName=Integrated ;;
217        ( false ) QuantName=Surfacic   ;;
218    esac
219    case ${useArea} in
220        ( true )  AreaName=Area   ;;
221        ( false ) AreaName=NoArea ;;
222    esac
223
224    if [[ "${Name}" != "None" ]] ; then
225        FullName=${Name}_${Order}Order
226    else
227        FullName=${Order}Order_${NormName}_${QuantName}_${AreaName}
228    fi
229
230    case ${Direction} in
231        ( o2a )
232        src=${oce} ; SRC=${OCE} ; srcGrid=${oceGrid} ; srcDomainType=${oceDomainType} ; SRCGRID=${OCEGRID} ; srcArea=area_grid_${OCEGRID}
233        dst=${atm} ; DST=${ATM} ; dstGrid=${atmGrid} ; dstDomainType=${atmDomainType} ; DSTGRID=${ATMGRID} ; dstArea=aire
234        ;;
235        ( a2o )
236        src=${atm} ; SRC=${ATM} ; srcGrid=${atmGrid} ; srcDomainType=${atmDomainType} ; SRCGRID=${ATMGRID} ; srcArea=aire
237        dst=${oce} ; DST=${OCE} ; dstGrid=${oceGrid} ; dstDomainType=${oceDomainType} ; DSTGRID=${OCEGRID} ; dstArea=area_grid_${OCEGRID}
238        ;;
239    esac
240    echo ${Green}"${SRC} ${SRCGRID} toward ${DST} ${DSTGRID} - ${Order} Order - Normalize: ${Renormalize} - Quantity: ${QuantName} - Area: ${AreaName}  "${Norm}
241    echo ${Green}"FullName : ${FullName}"${Norm}
242}
243
244#
245#Defines computer
246# ================
247if [[ $(hostname) = irene*    ]] ; then arch=irene ; center=tgcc ; fi
248if [[ $(hostname) = lsce*     ]] ; then arch=spip  ; center=spip ; fi
249
250case ${arch} in
251    ( irene )
252    set +vx
253    set +e
254    R_IN=$(ccc_home -u igcmg --cccwork)/IGCM
255    TMPDIR=${CCCWORKDIR}/TMP
256    SUBMIT_DIR=${BRIDGE_MSUB_PWD:-${SUBMIT_DIR}}
257    MpiRun="time ccc_mprun"
258    PyRun="time ccc_mprun -n 1" # Needed to force python to run on one process only
259    #module purge
260    source $(ccc_home -u igcmg)/MachineEnvironment/irene/env_irene
261    source ${SUBMIT_DIR}/arch.env
262    #module load nco
263    module load python3
264    module load datadir/igcmg
265    module list
266    set -e
267    ;;
268    ( spip )
269    R_IN=${HOME}/Scratch/IGCM
270    TMPDIR=${HOME}/Scratch/TMP
271    SUBMIT_DIR=$(pwd)
272    MpiRun="/opt/local/bin/mpirun -n 4"
273    PyRun="time"
274    ;;
275    ( * ) exit -1 ;;
276esac
277
278set -x ; set -e
279
280mkdir -p ${TMPDIR}/${CplModel} || exit 1
281cd       ${TMPDIR}/${CplModel} || exit 1
282rm -fr *
283
284#
285# Suffixes
286# ---------------------------------------------------------------------------
287
288case ${OCE} in
289    ( *ORC* )         oce=orc ; oceDomainType=curvilinear   ;;
290esac
291
292case ${ATM} in
293    ( *dynamico*    ) atm=ico ; atmDomainType=unstructured  ;;
294    ( *ICO*         ) atm=ico ; atmDomainType=unstructured  ;;
295    ( *lmd* | *LMD* ) atm=lmd ; atmDomainType=rectilinear   ;;
296esac
297
298case ${OCE} in # Periodicity type of ORCA grid
299    ( ORCA2*               ) OcePerio=6 ;; # 4 ORCA 6 PALEORCA
300    ( ORCA1*   | eORCA1*   ) OcePerio=6 ;;
301    ( ORCA025* | eORCA025* ) OcePerio=6 ;;
302esac
303#
304
305cp ${SUBMIT_DIR}/bin/interpol.exe       .
306cp ${SUBMIT_DIR}/*.py                   .
307cp ${SUBMIT_DIR}/iodef_atm_to_oce.xml   .
308cp ${SUBMIT_DIR}/iodef_oce_to_atm.xml   .
309
310#cp ${R_IN}/OCE/NEMO/${OCE}/${OCE}_coordinates_mask.nc  .
311#cp ${SUBMIT_DIR}/${OCE}_coordinates_mask_ref.nc  ${OCE}_coordinates_mask.nc
312#cp ${SUBMIT_DIR}/eORCA_R1_coordinates_mask_test_1105.nc ${OCE}_coordinates_mask.nc
313#cp ${SUBMIT_DIR}/TEST2REMOVE_coordinates_mask.test.nc ${OCE}_coordinates_mask.nc
314#cp ${SUBMIT_DIR}/TEST-CM61-LR-pi-01_mesh_mask.nc ${OCE}_coordinates_mask.nc
315#cp ${SUBMIT_DIR}/eORCA_R1_coordinates_mask_test_TUVW.nc ${OCE}_coordinates_mask.nc
316#cp ${SUBMIT_DIR}/eORCA_R1_coordinates_mask_test_1106.nc ${OCE}_coordinates_mask.nc
317#cp ${SUBMIT_DIR}/ORCA2.3_coordinates_mask_test_1106.nc ${OCE}_coordinates_mask.nc
318#cp ${SUBMIT_DIR}/coordinates_xios_ORCA2_1p_2806.nc ${OCE}_coordinates_mask.nc
319cp ${SUBMIT_DIR}/ORCA2.3_coordinates_mask_ref_0208.nc ${OCE}_coordinates_mask.nc
320cp ${R_IN}/ATM/GRID/${ATM}_grid.nc .
321
322# Soucis a corriger plus tard
323if [[ ${ATM} = LMD9695 ]] ; then
324    cat <<EOF > toDouble.nco
325lat                = double (lat) ;
326lon                = double (lon) ;
327aire               = double (aire) ;
328fract_oce          = double (fract_oce) ;
329fract_sic          = double (fract_sic) ;
330fract_oce_plus_sic = double (fract_oce_plus_sic) ;
331EOF
332    ncap2 --history --overwrite --script-file toDouble.nco ${ATM}_grid.nc tmp_${ATM}_grid.nc
333    mv tmp_${ATM}_grid.nc ${ATM}_grid.nc
334fi
335
336
337##
338echo ${Titre}"NEMO T point towards ATM - 1st order"${Norm}
339## ===========================================================================
340echo "Command parameters : ${Command}"
341setValues ${DefaultValues}
342
343OutFileName=${srcGrid}${src}_to_${dstGrid}${dst}_${FullName}
344
345cp iodef_oce_to_atm.xml   iodef.xml
346
347python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_src"]/field[@id="mask_src"]'   -k name  -v maskutil_T
348python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_src"]/field[@id="area_src"]'   -k name  -v area_grid_T
349python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/domain_definition/domain[@id="domain_src"]'                   -k type  -v ${srcDomainType}
350python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/domain_definition/domain[@id="domain_dst"]'                   -k type  -v ${dstDomainType}
351python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain' -k order -v 1
352python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain' -k quantity    -v false
353python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain' -k renormalize -v false
354python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain' -k use_area -v false
355python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="mask_source"]' -k name  -v maskutil_T
356python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="area_source"]' -k name  -v area_grid_T
357python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]'                               -k name  -v dia_${OutFileName}
358python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="title"]'       -t "${SRC} mask interpolated to ${DST}"
359python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="source_grid"]' -t ${srcDomainType}
360python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="dest_grid"]'   -t ${dstDomainType}
361python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="order"]'       -t 1
362python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_src"]'                    -k type  -v ${srcDomainType}
363python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]'                    -k type  -v ${dstDomainType}
364python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain' -k weight_filename -v rmp_${OutFileName}.nc
365python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k order -v 1
366python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="normalization"]' -t false
367python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="quantity"]'      -t false
368python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="use_area"]'      -t false
369python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k renormalize -v false
370python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k quantity    -v false
371python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k use_area    -v false
372
373cp iodef.xml iodef_${OutFileName}.xml
374ln -fs ${OCE}_coordinates_mask.nc  oce_grid.nc
375ln -fs ${ATM}_grid.nc              atm_grid.nc
376
377${MpiRun} ./interpol.exe --mask_src=${maskSrc} --mask_dst=${maskDst} --use_area=${useArea}
378
379ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 1st order"  rmp_${OutFileName}.nc
380ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 1st order"  dia_${OutFileName}.nc
381
382ncatted --history --attribute normalization,global,o,c,"false"  rmp_${OutFileName}.nc
383ncatted --history --attribute normalization,global,o,c,"false"  dia_${OutFileName}.nc
384
385ncatted --history --attribute Quantity,global,o,c,"false"  rmp_${OutFileName}.nc
386ncatted --history --attribute Quantity,global,o,c,"false"  dia_${OutFileName}.nc
387
388ncatted --history --attribute UseArea,global,o,c,"false"  rmp_${OutFileName}.nc
389ncatted --history --attribute UseArea,global,o,c,"false"  dia_${OutFileName}.nc
390
391##
392echo ${Titre}"Correct spurious values (extremes)"${Norm}
393## ===========================================================================
394cat <<EOF > correction_masque.nco
395where (OceFrac <   0.00001 )  OceFrac=OceFrac.get_miss() ;
396where (OceFrac >   0.99999 )  OceFrac=1.0 ;
397OceFrac.delete_miss() ;
398// Fill masked values to land values
399where (OceFrac >  1.0 )  OceFrac=0.0 ;
400where (OceFrac <  0.0 )  OceFrac=0.0 ;
401OceMask = OceFrac ;
402EOF
403ncap2 --history --overwrite --script-file correction_masque.nco dia_t${oce}_to_t${atm}_${FullName}.nc tmp_dia_t${oce}_to_t${atm}_${FullName}.nc ; mv tmp_dia_t${oce}_to_t${atm}_${FullName}.nc dia_t${oce}_to_t${atm}_${FullName}.nc
404ncatted --history -a missing_value,OceFrac,d,,"" -a _FillValue,OceFrac,d,,"" dia_t${oce}_to_t${atm}_${FullName}.nc
405ncatted --history -a missing_value,OceMask,d,,"" -a _FillValue,OceMask,d,,"" dia_t${oce}_to_t${atm}_${FullName}.nc
406 
407##
408echo ${Titre}"Creates mask on ATM grid"${Norm}
409## ===========================================================================
410cp dia_t${oce}_to_t${atm}_${FullName}.nc  dia_t${oce}_to_t${atm}_${FullName}_mask.nc
411ncks --alphabetize --history --overwrite --variable OceFrac dia_t${oce}_to_t${atm}_${FullName}_mask.nc ${ATM}_grid_maskFrom_${OCE}.nc
412ncatted  --history --attribute name,global,m,c,"${ATM}_grid_maskFrom_${OCE}.nc" ${ATM}_grid_maskFrom_${OCE}.nc
413
414cat <<EOF > creation_masque.nco
415Oce2AtmMask = OceMask ;
416where (OceMask >  0.0 )  Oce2AtmMask=1 ;
417where (OceMask <= 0.0 )  Oce2AtmMask=0 ;
418EOF
419
420ncap2 --history --overwrite --script-file creation_masque.nco dia_t${oce}_to_t${atm}_${FullName}.nc tmp_dia_${ATM}_grid_maskFrom_${OCE}.nc
421ncks --overwrite --history --variable OceMask,OceFrac,Oce2AtmMask tmp_dia_${ATM}_grid_maskFrom_${OCE}.nc ${ATM}_grid_maskFrom_${OCE}.nc
422
423if [[ $(ncdump -h ${ATM}_grid_maskFrom_${OCE}.nc | grep domain_dst | wc -l) -gt 0 ]] ; then
424    echo "Change dimension names, and some attributes accordingly"
425    ## ===========================================================
426    case ${atm} in
427        ( *ico* ) 
428        ncrename --history --dimension cell_domain_dst,cell              ${ATM}_grid_maskFrom_${OCE}.nc
429        ncrename --history --dimension nvertex_domain_dst,nvertex        ${ATM}_grid_maskFrom_${OCE}.nc
430        ncrename --history --variable  lat_domain_dst,lat                ${ATM}_grid_maskFrom_${OCE}.nc
431        ncrename --history --variable  lon_domain_dst,lon                ${ATM}_grid_maskFrom_${OCE}.nc
432        ncrename --history --variable  bounds_lat_domain_dst,bounds_lat  ${ATM}_grid_maskFrom_${OCE}.nc
433        ncrename --history --variable  bounds_lon_domain_dst,bounds_lon  ${ATM}_grid_maskFrom_${OCE}.nc
434        ncatted  --history --attribute bounds,lat,m,c,"bounds_lat"       ${ATM}_grid_maskFrom_${OCE}.nc
435        ncatted  --history --attribute bounds,lon,m,c,"bounds_lon"       ${ATM}_grid_maskFrom_${OCE}.nc
436        ;;
437        ( *lmd* )
438        ncrename --history --variable  lon_domain_dst,lon                ${ATM}_grid_maskFrom_${OCE}.nc
439        ncrename --history --variable  lat_domain_dst,lat                ${ATM}_grid_maskFrom_${OCE}.nc
440        ncrename --history --dimension lon_domain_dst,lon                ${ATM}_grid_maskFrom_${OCE}.nc
441        ncrename --history --dimension lat_domain_dst,lat                ${ATM}_grid_maskFrom_${OCE}.nc
442        ;;
443    esac
444    ncatted  --history --attribute coordinates,OceFrac,m,c,"lat lon" ${ATM}_grid_maskFrom_${OCE}.nc
445    ncatted  --history --attribute coordinates,OceMask,m,c,"lat lon" ${ATM}_grid_maskFrom_${OCE}.nc
446    ncatted  --history --attribute coordinates,Oce2AtmMask,m,c,"lat lon" ${ATM}_grid_maskFrom_${OCE}.nc
447
448    ncatted  --history --attribute long_name,OceFrac,c,c,"fraction of ocean in a grid cell" ${ATM}_grid_maskFrom_${OCE}.nc
449    ncatted  --history --attribute units,OceFrac,c,c,"[0,1]" ${ATM}_grid_maskFrom_${OCE}.nc
450    ncatted  --history --attribute long_name,OceMask,c,c,"fraction of ocean in a grid cell" ${ATM}_grid_maskFrom_${OCE}.nc
451    ncatted  --history --attribute units,OceMask,c,c,"[0,1]" ${ATM}_grid_maskFrom_${OCE}.nc
452    ncatted  --history --attribute long_name,Oce2AtmMask,c,c,"land mask" ${ATM}_grid_maskFrom_${OCE}.nc
453    ncatted  --history --attribute units,Oce2AtmMask,c,c,"Land:0, Ocean:1" ${ATM}_grid_maskFrom_${OCE}.nc
454 
455fi
456
457ncks --history --alphabetize --append --variable aire atm_grid.nc ${ATM}_grid_maskFrom_${OCE}.nc
458ncatted  --history --attribute units,aire,m,c,"m^2" ${ATM}_grid_maskFrom_${OCE}.nc
459
460[[ ${atm} = *ico* ]] && ncks --alphabetize --history --append --variable bounds_lon,bounds_lat atm_grid.nc ${ATM}_grid_maskFrom_${OCE}.nc
461
462
463
464##
465#echo ${Titre}"Creates mask of coastal OCE points"${Norm}
466## ===========================================================================
467#${PyRun} python3 -u ComputeNemoCoast.py -n ${OcePerio} -i ${OCE}_coordinates_mask.nc # Creates OceCoastal
468
469##
470#echo ${Titre}"Creates mask of coastal ATM points"${Norm}
471## ===========================================================================
472#cat <<EOF > coastal.nco
473#AtmCoastal = OceFrac * 0.0 ;
474#where (OceFrac > 0.0 && OceFrac < 1.0 )  AtmCoastal = 1.0 ;
475#EOF
476#ncap2 --history --overwrite --script-file coastal.nco ${ATM}_grid_maskFrom_${OCE}.nc ${ATM}_coastal_maskFrom_${OCE}.nc
477#ncks --history --append --variable AtmCoastal ${ATM}_coastal_maskFrom_${OCE}.nc ${ATM}_grid_maskFrom_${OCE}.nc
478#rm ${ATM}_coastal_maskFrom_${OCE}.nc
479
480##
481echo ${Titre}"Other weights files"${Norm}
482## ===========================================================================
483# Loop on commands
484for Command in ${CommandList[@]}
485do
486    echo "Command parameters : ${Command}"
487    setValues ${Command}
488    if [[ ${Command} = "Runoff"  ]] ; then okRunoff=yes  ; continue ; fi
489    if [[ ${Command} = "Calving" ]] ; then okCalving=yes ; continue ; fi
490    if [[ ${Command} = "Grids"   ]] ; then okGrids=yes   ; continue ; fi
491   
492    ln -fs ${OCE}_coordinates_mask.nc  oce_grid.nc
493    #ln -fs ${ATM}_grid.nc              atm_grid.nc
494    ln -fs ${ATM}_grid_maskFrom_${OCE}.nc atm_grid.nc
495   
496    case ${Direction} in
497        ( o2a )
498        cp iodef_oce_to_atm.xml iodef.xml
499       
500        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_src"]/field[@id="mask_src"]'   -k name -v maskutil_${DSTGRID} 
501        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_dst"]/field[@id="mask_dst"]'   -k name -v Oce2AtmMask
502       
503        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="mask_source"]' -k name -v maskutil_${SRCGRID}
504        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="area_source"]' -k name -v area_grid_${SRCGRID}
505        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_dst"]/field[@id="mask_dest"]'   -k name -v Oce2AtmMask
506        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_dst"]/field[@id="area_dest"]'   -k name -v aire
507        ;;
508        ( a2o )
509        cp iodef_atm_to_oce.xml iodef.xml
510       
511        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_src"]/field[@id="mask_src"]'   -k name -v Oce2AtmMask
512        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/file_definition/file[@id="file_dst"]/field[@id="mask_dst"]'   -k name -v mask_${DSTGRID}
513       
514        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="mask_source"]' -k name  -v Oce2AtmMask
515        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_src"]/field[@id="area_source"]' -k name  -v aire
516        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_dst"]/field[@id="mask_dest"]'   -k name  -v mask_${DSTGRID}
517        python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="file_dst"]/field[@id="area_dest"]'   -k name  -v area_grid_${DSTGRID}
518        ;;
519    esac
520
521    OutFileName=${srcGrid}${src}_to_${dstGrid}${dst}_${FullName}
522   
523    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/domain_definition/domain[@id="domain_dst"]'                     -k type  -v ${dstDomainType}
524    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_read"]/domain_definition/domain[@id="domain_src"]'                     -k type  -v ${srcDomainType}
525   
526    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_src"]'                      -k type  -v ${srcDomainType}
527    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]'                      -k type  -v ${dstDomainType}
528   
529    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k weight_filename -v rmp_${OutFileName}.nc
530    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k order       -v ${numOrder}
531    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k quantity    -v ${Quantity}
532    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k renormalize -v ${Renormalize}
533    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/domain_definition/domain[@id="domain_dst"]/interpolate_domain'   -k use_area    -v ${useArea}
534   
535    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]'                                 -k name -v dia_${OutFileName}
536    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="title"]'         -t "${SRC} mask interpolated to ${DST}"
537    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="dest_grid"]'     -t ${dstDomainType}
538    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="source_grid"]'   -t ${srcDomainType}
539    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="normalization"]' -t ${Renormalize}
540    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="order"]'         -t ${numOrder}   
541    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="quantity"]'      -t ${Quantity}
542    python3 update_xml.py -i iodef.xml -n 'context[@id="interpol_run"]/file_definition/file[@id="dia"]/variable[@name="use_area"]'      -t ${useArea}
543   
544    cp iodef.xml iodef_${OutFileName}.xml
545    ${MpiRun} ./interpol.exe --mask_src=${maskSrc} --mask_dst=${maskDst} --use_area=${useArea}
546
547    case ${numOrder} in
548        ( 1 )
549        ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 1st order"  rmp_${OutFileName}.nc
550        ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 1st order"  dia_${OutFileName}.nc
551        ;;
552        ( 2 )
553        ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 2nd order"  rmp_${OutFileName}.nc
554        ncatted --history --attribute map_method,global,o,c,"Conservative Remapping - 2nd order"  dia_${OutFileName}.nc
555        ;;
556    esac
557
558    ncatted --history --attribute normalization,global,o,c,"${Renormalize}"  rmp_${OutFileName}.nc
559    ncatted --history --attribute normalization,global,o,c,"${Renormalize}"  dia_${OutFileName}.nc
560
561    ncatted --history --attribute Quantity,global,o,c,"${Quantity}"  rmp_${OutFileName}.nc
562    ncatted --history --attribute Quantity,global,o,c,"${Quantity}"  dia_${OutFileName}.nc
563
564    ncatted --history --attribute UseArea,global,o,c,"${useArea}"  rmp_${OutFileName}.nc
565    ncatted --history --attribute UseArea,global,o,c,"${useArea}"  dia_${OutFileName}.nc
566   
567done
568
569##
570echo ${Titre}"Add some metadata in file headers"${Norm}
571## ===========================================================================
572
573NCO="$(ncks --version |& tail -1|sed 's/ncks //')"
574PYTHON_VER=$( python3 -c "import sys ; print (sys.version.split(' ')[0])" )
575for InFile in $(ls *${oce}_to_*${atm}_*.nc *${atm}_to_*${oce}_*.nc ${ATM}_grid_maskFrom_${OCE}.nc 2> /dev/null) ; do
576    ncatted --history \
577            --attribute LongName,global,d,,                                       \
578            --attribute nco_openmp_thread_number,global,d,,                       \
579            --attribute Conventions,global,o,c,"CF-1.6"                           \
580            --attribute source,global,o,c,"IPSL Earth system model"               \
581            --attribute group,global,o,c,"ICMC IPSL Climate Modelling Center"     \
582            --attribute Institution,global,o,c,"IPSL https://www.ipsl.fr"         \
583            --attribute Ocean,global,o,c,"${OCE} https://www.nemo-ocean.eu"       \
584            --attribute Atmosphere,global,o,c,"${ATM} http://lmdz.lmd.jussieu.fr" \
585            --attribute production,global,o,c,"$(finger ${LOGNAME} | head -1 | awk '{print $4, $5}') " \
586            --attribute originalFiles,global,o,c,"${OCE}_coordinates_mask.nc ${ATM}_grid_mask.nc"      \
587            --attribute associatedFiles,global,o,c,"grids_${CplModel}.nc areas_${CplModel}.nc masks_${CplModel}.nc" \
588            --attribute directory,global,o,c,"$(pwd)"                             \
589            --attribute description,global,o,c,"Fields needed by OASIS-MCT"       \
590            --attribute title,global,o,c,"${InFile}.nc"                           \
591            --attribute Program,global,o,c,"Generated by CreateWeightsMask"       \
592            --attribute timeStamp,global,o,c,"$(date)"                            \
593            --attribute HOSTNAME,global,o,c,"$(hostname)"                         \
594            --attribute LOGNAME,global,o,c,"$(whoami)"                            \
595            --attribute NCO,global,o,c,"NCO netCDF Operator ${NCO} http://nco.sourceforge.net" \
596            --attribute Python,global,o,c,"Python3 version ${PYTHON_VER}"          \
597            --attribute OS,global,o,c,"$(uname -o)"                               \
598            --attribute release,global,o,c,"$(uname -r)"                          \
599            --attribute directory,global,o,c,"$(pwd)"                             \
600            --attribute description,global,o,c,"Generated with XIOS http://forge.ipsl.jussieu.fr/ioserver and MOSAIX https://forge.ipsl.jussieu.fr/igcmg/browser/TOOLS/MOSAIX" \
601            --attribute SVN_Author,global,o,c,'$Author$'                 \
602            --attribute SVN_Date,global,o,c,'$Date$'                            \
603            --attribute SVN_Revision,global,o,c,'$Revision$'               \
604            --attribute SVN_Id,global,o,c,'$Id$'                                \
605            ${InFile}
606done
607
608# Duplicate with no global attribute to avoid erasing attributes in other files
609cp ${ATM}_grid_maskFrom_${OCE}.nc ${ATM}_grid_maskFrom_${OCE}_noglobal.nc
610ncatted --history --attribute ,global,d,c, ${ATM}_grid_maskFrom_${OCE}_noglobal.nc
611
612##
613echo ${Titre}"Update and complete weight files to fit OASIS requested format"${Norm}
614## ===========================================================================
615cat <<EOF > add_dim.nco
616defdim("num_wgts",1) ;
617weight[n_weight, num_wgts] = weight ;
618EOF
619
620for rmpFile in rmp_*.nc ; do
621    mv ${rmpFile} tmp_${rmpFile}
622    ncap2 --history --script-file add_dim.nco tmp_${rmpFile} ${rmpFile} ; rm tmp_${rmpFile}
623   
624    ncrename --history --dimension n_weight,num_links   ${rmpFile}
625    ncrename --history --variable  src_idx,src_address  ${rmpFile}
626    ncrename --history --variable  dst_idx,dst_address  ${rmpFile}
627    ncrename --history --variable  weight,remap_matrix  ${rmpFile}
628
629 
630    ncatted --history --attribute conventions,global,o,c,"SCRIP"   ${rmpFile}
631    ncatted --history --attribute normalization,global,o,c,"none"  ${rmpFile}
632   
633    case ${rmpFile} in
634        ( rmp_*${oce}_to_t${atm}_* )
635        ncatted --history \
636                --attribute title,global,o,c,"Weights ${OCE} to ${ATM}" \
637                --attribute source_grid,global,o,c,"${oceDomainType}" \
638                --attribute dest_grid,global,o,c,"${atmDomainType}"   \
639                ${rmpFile}     
640        ;;
641        ( rmp_*${atm}_to_*${oce}_* )
642        ncatted --history \
643                --attribute title,global,o,c,"Weights ${ATM} to ${OCE}" \
644                --attribute source_grid,global,o,c,"${atmDomainType}" \
645                --attribute dest_grid,global,o,c,"${oceDomainType}"   \
646                ${rmpFile}
647        ;;
648    esac
649done
650
651ls
652##
653echo ${Titre}"Add missing variables in rmp files"${Norm}
654## ===========================================================================
655for rmpFile in $(ls rmp_?${atm}_to_[tuv]${oce}_*.nc rmp_[tuv]${oce}_to_t${atm}_*.nc 2> /dev/null ) ; do
656    echo ${rmpFile}
657    a_to_o=false ; o_to_a=false
658    case ${rmpFile} in
659        (  rmp_?${oce}_to_?${atm}_*.nc ) o_to_a=true ;;
660        (  rmp_?${atm}_to_?${oce}_*.nc ) a_to_o=true ;;
661    esac
662
663    for Grid in t u v o c ; do # Identify grids
664        [[ ${rmpFile} = rmp_${Grid}${oce}_to_?${atm}_*.nc ]] && ogrid=${Grid}
665        [[ ${rmpFile} = rmp_?${oce}_to_${Grid}${atm}_*.nc ]] && agrid=${Grid}
666        [[ ${rmpFile} = rmp_${Grid}${atm}_to_?${oce}_*.nc ]] && agrid=${Grid}
667        [[ ${rmpFile} = rmp_?${atm}_to_${Grid}${oce}_*.nc ]] && ogrid=${Grid}
668    done
669    OGRID=${ogrid^}
670    AGRID=${agrid^}
671       
672    cat <<EOF >add_varoce.nco
673defdim ("src_grid_size"   , \$x_grid_${OGRID}.size*\$y_grid_${OGRID}.size) ;
674defdim ("src_grid_corners", 4) ;
675defdim ("src_grid_rank"   , 2) ;
676//
677src_grid_dims[src_grid_rank] = { \$y_grid_${OGRID}.size, \$x_grid_${OGRID}.size } ;
678//
679src_grid_center_lat [src_grid_size] =  0.0d ;
680src_grid_center_lon [src_grid_size] =  0.0d ;
681src_grid_center_lat (:) = nav_lat_grid_${OGRID}(:,:)   ;
682src_grid_center_lon (:) = nav_lon_grid_${OGRID}(:,:)   ;
683//
684src_grid_corner_lat [src_grid_size, src_grid_corners] = 0.0d ;
685src_grid_corner_lon [src_grid_size, src_grid_corners] = 0.0d ;
686src_grid_corner_lat(:,:) = bounds_lat_grid_${OGRID}(:,:,:) ;
687src_grid_corner_lon(:,:) = bounds_lon_grid_${OGRID}(:,:,:) ;
688//
689src_grid_imask [src_grid_size] =    0 ;
690src_grid_area  [src_grid_size] = 0.0d ;
691src_grid_frac  [src_grid_size] = 1.0d ;
692src_grid_imask (:) = 1 - mask_${OGRID}(:,:) ;
693src_grid_imask.int() ;
694src_grid_area  (:) = area_grid_${OGRID}(:,:) ;
695EOF
696
697    cp add_varoce.nco add_varoce_$(basename ${rmpFile} .nc)_o_to_a.nco
698    [[ ${o_to_a} = true ]] && ncap2 --history --append --script-file add_varoce_$(basename ${rmpFile} .nc)_o_to_a.nco ${OCE}_coordinates_mask.nc ${rmpFile}
699    sed --in-place "s/src_/dst_/g" add_varoce.nco
700    cp add_varoce.nco add_varoce_$(basename ${rmpFile} .nc)_a_to_o.nco
701    [[ ${a_to_o} = true ]] && ncap2 --history --append --script-file add_varoce_$(basename ${rmpFile} .nc)_a_to_o.nco ${OCE}_coordinates_mask.nc ${rmpFile}
702               
703    if [[ ${atm} = ico ]] ; then
704        cat <<EOF >add_varatm.nco
705defdim ("dst_grid_size"   , \$cell.size) ;
706defdim ("dst_grid_corners", 6) ;
707defdim ("dst_grid_rank"   , 2) ;
708//
709dst_grid_dims[dst_grid_rank] = { \$cell.size, 1 } ;
710//
711dst_grid_center_lat [dst_grid_size] =  0.0d ;
712dst_grid_center_lon [dst_grid_size] =  0.0d ;
713dst_grid_center_lat (:) = lat(:)   ;
714dst_grid_center_lon (:) = lon(:)   ;
715//
716dst_grid_corner_lat [dst_grid_size, dst_grid_corners] = 0.0d ;
717dst_grid_corner_lon [dst_grid_size, dst_grid_corners] = 0.0d ;
718dst_grid_corner_lat(:,:) = bounds_lat(:,:) ;
719dst_grid_corner_lon(:,:) = bounds_lon(:,:) ;
720//
721dst_grid_imask [dst_grid_size] =    0 ;
722dst_grid_area  [dst_grid_size] = 0.0d ;
723dst_grid_frac  [dst_grid_size] = 1.0d ;
724dst_grid_imask (:) = 1 - Oce2AtmMask(:) ;
725dst_grid_imask.int() ;
726dst_grid_area  (:) = aire(:) ;
727dst_grid_frac  (:) = OceFrac(:) ;
728EOF
729        cp add_varatm.nco add_varatm_$(basename ${rmpFile} .nc)_o_to_a.nco
730        if [[ ${o_to_a} = true ]] ; then
731            ncap2 --history --append --script-file add_varatm_$(basename ${rmpFile} .nc)_o_to_a.nco ${ATM}_grid_maskFrom_${OCE}_noglobal.nc ${rmpFile}
732            ncks --alphabetize --history --overwrite --variable src_address,dst_address,remap_matrix,src_grid_dims,src_grid_center_lat,src_grid_center_lon,src_grid_corner_lon,src_grid_corner_lat,src_grid_area,src_grid_imask,dst_grid_dims,dst_grid_center_lat,dst_grid_center_lon,dst_grid_corner_lon,dst_grid_corner_lat,dst_grid_area,dst_grid_imask ${rmpFile} rmp_tmp.nc
733            mv rmp_tmp.nc ${rmpFile}
734        fi
735                   
736        sed --in-place "s/dst_/src_/g" add_varatm.nco
737        cp add_varatm.nco add_varatm_$(basename ${rmpFile} .nc)_a_to_o.nco
738        if [[ ${a_to_o} = true ]] ; then
739            ncap2 --history --append --script-file add_varatm_$(basename ${rmpFile} .nc)_a_to_o.nco ${ATM}_grid_maskFrom_${OCE}_noglobal.nc ${rmpFile}
740            ncks --alphabetize --history --overwrite --variable src_address,dst_address,remap_matrix,src_grid_dims,src_grid_center_lat,src_grid_center_lon,src_grid_corner_lon,src_grid_corner_lat,src_grid_area,src_grid_imask,dst_grid_dims,dst_grid_center_lat,dst_grid_center_lon,dst_grid_corner_lon,dst_grid_corner_lat,dst_grid_area,dst_grid_imask ${rmpFile} rmp_tmp.nc
741            mv rmp_tmp.nc ${rmpFile}
742        fi
743    fi
744   
745    if [[ ${atm} = lmd ]] ; then
746        cat <<EOF >add_varatm.nco
747defdim ("dst_grid_size"   , \$lon.size*\$lat.size) ;
748defdim ("dst_grid_corners", 4) ;
749defdim ("dst_grid_rank"   , 2) ;
750//
751dst_grid_dims[dst_grid_rank] = { \$lat.size, \$lon.size } ;
752//
753dst_grid_center_lat [dst_grid_size] =  0.0d ;
754dst_grid_center_lon [dst_grid_size] =  0.0d ;
755lat0lon[lat,lon] = lat(:)+0*lon(:) ;
756lon0lat[lat,lon] = lon(:)+0*lat(:) ;
757dst_grid_center_lat (:) = lat0lon(:,:)   ;
758dst_grid_center_lon (:) = lon0lat(:,:)   ;
759//
760//dst_grid_corner_lat [dst_grid_size, dst_grid_corners] = 0.0d ; // Not available for LMDZ lon/lat grid
761//dst_grid_corner_lon [dst_grid_size, dst_grid_corners] = 0.0d ;
762//dst_grid_corner_lat(:,:) = bounds_lat(:,:) ;
763//dst_grid_corner_lon(:,:) = bounds_lon(:,:) ;
764//
765dst_grid_imask [dst_grid_size] =    0 ;
766dst_grid_area  [dst_grid_size] = 0.0d ;
767dst_grid_frac  [dst_grid_size] = 1.0d ;
768dst_grid_imask (:) = 1 - Oce2AtmMask(:,:) ;
769dst_grid_imask.int() ;
770dst_grid_area  (:) = aire(:,:) ;
771dst_grid_frac (:)  = OceFrac(:,:) ;
772EOF
773        cp add_varatm.nco add_varatm_$(basename ${rmpFile} .nc)_o_to_a.nco
774        if [[ ${o_to_a} = true ]] ; then
775            ncap2 --history --append --script-file add_varatm_$(basename ${rmpFile} .nc)_o_to_a.nco ${ATM}_grid_maskFrom_${OCE}_noglobal.nc ${rmpFile}
776            ncks --alphabetize --history --overwrite --variable src_address,dst_address,remap_matrix,src_grid_dims,src_grid_center_lat,src_grid_center_lon,src_grid_corner_lon,src_grid_corner_lat,src_grid_area,src_grid_imask,dst_grid_dims,dst_grid_center_lat,dst_grid_center_lon,dst_grid_area,dst_grid_imask ${rmpFile} rmp_tmp.nc
777            mv rmp_tmp.nc ${rmpFile}
778        fi
779       
780        sed --in-place "s/dst/src/g" add_varatm.nco
781        cp add_varatm.nco add_varatm_$(basename ${rmpFile} .nc)_a_to_o.nco
782        if [[ ${a_to_o} = true ]] ; then
783            ncap2 --history --append --script-file add_varatm_$(basename ${rmpFile} .nc)_a_to_o.nco ${ATM}_grid_maskFrom_${OCE}_noglobal.nc ${rmpFile}
784            ncks --alphabetize --history --overwrite --variable src_address,dst_address,remap_matrix,src_grid_dims,src_grid_center_lat,src_grid_center_lon,src_grid_area,src_grid_imask,dst_grid_dims,dst_grid_center_lat,dst_grid_center_lon,dst_grid_corner_lon,dst_grid_corner_lat,dst_grid_area,dst_grid_imask ${rmpFile} rmp_tmp.nc
785            mv rmp_tmp.nc ${rmpFile}
786        fi
787    fi
788done
789ls -al ${OCE}_coordinates_mask.nc
790##
791## ============================================================================
792echo ${Titre}"Creates and save auxiliary files for OASIS : grids.nc, areas.nc and masks.nc"${Norm}
793cp ${SUBMIT_DIR}/CreateOasisGrids.bash .
794bash CreateOasisGrids.bash --oce ${OCE} --atm ${ATM}
795
796
797##
798echo ${Titre}"Runoff weights"${Norm}
799## ===========================================================================
800if [[ "X${okRunoff}" = "Xyes" ]] ; then
801    ${PyRun} python3 -u RunoffWeights.py --oce=${OCE} --atm=${ATM} \
802              --atmCoastWidth=${atmCoastWidth} --oceCoastWidth=${oceCoastWidth} --searchRadius=${searchRadius} \
803              --grids=grids_${CplModel}.nc --areas=areas_${CplModel}.nc --masks=masks_${CplModel}.nc \
804              --o2a=${ATM}_grid_maskFrom_${OCE}.nc --output=rmp_t${atm}_to_t${oce}_runoff_${runOff_atmQuantity}_to_${runOff_oceQuantity}.nc \
805              --fmt=${FMT_XIOS} \
806              --atmQuantity=${runOff_atmQuantity} --oceQuantity=${runOff_oceQuantity} --ocePerio=${OcePerio}
807fi
808
809##
810echo ${Titre}"Calving weights"${Norm}
811## ===========================================================================
812if [[ "X${okCalving}" = "Xyes" ]] ; then
813    case ${OCE} in
814        ( eORCA025* )
815        cp /ccc/work/cont003/gencmip6/deshayej/eORCA_R025_runoff_v1.2.nc .
816        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_nosouth.nc  --fmt=${FMT_XIOS} \
817                  --oce=${OCE} --atm=${ATM} --type=nosouth  --dir=.
818        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_iceberg.nc  --fmt=${FMT_XIOS} \
819                  --oce=${OCE} --atm=${ATM} --type=iceberg  --dir=.  --repartition_file=eORCA_R025_runoff_v1.2.nc --repartition_var=Icb_flux
820        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_iceshelf.nc --fmt=${FMT_XIOS} \
821                  --oce=${OCE} --atm=${ATM} --type=iceshelf --dir=.  --repartition_file=eORCA_R025_runoff_v1.2.nc --repartition_var=sornfisf
822        ;;
823       
824        ( eORCA1.2 )
825        cp ${R_IN}/OCE/NEMO/ORCA1_LIM3_PISCES/v3.6_stable/runoff-icb_DaiTrenberth_Depoorter_eORCA1_JD.nc .
826        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_nosouth.nc  --fmt=${FMT_XIOS}\
827                  --oce=${OCE} --atm=${ATM} --type=nosouth  --dir=.
828        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_iceberg.nc  --fmt=${FMT_XIOS}\
829                  --oce=${OCE} --atm=${ATM} --type=iceberg  --dir=. --repartition_file=runoff-icb_DaiTrenberth_Depoorter_eORCA1_JD.nc --repartition_var=Icb_flux
830        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_iceshelf.nc --fmt=${FMT_XIOS}\
831                  --oce=${OCE} --atm=${ATM} --type=iceshelf --dir=. --repartition_file=runoff-icb_DaiTrenberth_Depoorter_eORCA1_JD.nc --repartition_var=sornfisf
832        ;;
833       
834        ( * )
835        ${PyRun} python3 -u CalvingWeights.py --output=rmp_t${atm}_to_t${oce}_calving_full.nc --fmt=${FMT_XIOS} \
836                  --oce=${OCE} --atm=${ATM} --type=full     --dir=. --ocePerio=${OcePerio}
837        ;;
838
839    esac
840fi
841
842##
843echo ${Titre}"Simplifies headers, add version and comment"${Norm}
844## ===========================================================================
845for File in $(ls dia_*.nc rmp_*.nc ${ATM}_grid_maskFrom_${OCE}*.nc areas_${OCE}x${ATM}*.nc grids_${OCE}x${ATM}*.nc masks_${OCE}x${ATM}*.nc 2> /dev/null ) ; do
846    ncatted --history --attribute history_of_appended_files,global,d,c,"" ${File}
847    ncatted --history --attribute history,global,d,c,"" ${File}
848    [[ "X${Comment}" != "X" ]] && ncatted --history --attribute Comment,global,o,c,"${Comment}"  ${File}
849    [[ "X${Version}" != "X" ]] && ncatted --history --attribute Version,global,o,c,"${Version}"  ${File}
850    [[ "X${Tag}" != "X"     ]] && ncatted --history --attribute Version,global,o,c,"${Tag}"      ${File}
851done
852
853##
854echo ${Titre}"Rename rmp and dia files"${Norm}
855## ===========================================================================
856for File in $(ls *${oce}*${atm}* *${atm}*${oce}*  2> /dev/null ); do
857    NewFile=$(echo ${File} | sed -e "s/${atm}/${ATM}/" -e "s/${oce}/${OCE}/" )
858    mv ${File} ${NewFile}
859done
860
861##
862echo ${Titre}"Add Tag"${Norm}
863## ===========================================================================
864if [[ "X${Tag}" != "X" ]] ; then
865    for File in $(ls dia_*.nc rmp_*.nc ${ATM}_grid_maskFrom_${OCE}*.nc areas_${OCE}x${ATM}*.nc grids_${OCE}x${ATM}*.nc masks_${OCE}x${ATM}*.nc 2> /dev/null ) ; do
866        mv ${File} $(basename ${File} .nc)_${Tag}.nc
867    done
868fi
869##
870echo ${Titre}"Add Version"${Norm}
871## ===========================================================================
872if [[ "X${Version}" != "X" ]] ; then
873    for File in $(ls dia_*.nc rmp_*.nc ${ATM}_grid_maskFrom_${OCE}*.nc areas_${OCE}x${ATM}*.nc grids_${OCE}x${ATM}*.nc masks_${OCE}x${ATM}*.nc 2> /dev/null ) ; do
874        mv ${File} $(basename ${File} .nc)_${Version}.nc
875    done
876fi
877   
878## ===========================================================================
879echo ${Titre}"Save results"${Norm}
880## ===========================================================================
881for File in $(ls dia_*.nc rmp_*.nc ${ATM}_grid_maskFrom_${OCE}*.nc areas_${OCE}x${ATM}*.nc grids_${OCE}x${ATM}*.nc masks_${OCE}x${ATM}*.nc 2> /dev/null ) ; do
882    cp ${File} ${SUBMIT_DIR}
883done
884
885
886##
887echo ${Titre}"Creates a README.txt file"${Norm}
888## ===========================================================================
889[[ -f README.txt ]] && rm README.txt
890UUID=$(uuid)
891
892cat <<EOF > README.txt
893Files produced by CreateWeightsMask.bash and CreateOasisGrids.bash
894
895rmp_* are weights files
896dia_* are diagnostic files not needed for the coupler
897grids_${CplModel}.nc areas_${CplModel}.nc masks_${CplModel}.nc are auxiliary file needed by OASIS-MCT
898All files have the same uuid in the global attributes
899
900Description     : Weigths and auxiliary files for coupling ${OCE} and ${ATM} needed by OASIS-MCT
901Conventions     : CF-1.6
902source          : IPSL Earth system model
903group           : ICMC IPSL Climate Modelling Center
904Institution     : IPSL https://www.ipsl.fr
905Ocean           : ${OCE} https://www.nemo-ocean.eu
906Atmosphere      : ${ATM} http://lmdz.lmd.jussieu.fr
907production      : $(finger ${LOGNAME} | head -1 | awk '{print $4, $5}')
908originalFiles   : ${OCE}_coordinates_mask.nc ${ATM}_grid_mask.nc
909associatedFiles : grids_${CplModel}.nc areas_${CplModel}.nc masks_${CplModel}.nc
910directory       : $(pwd)
911timeStamp       : $(date)
912uuid            : ${UUID}
913HOSTNAME        : $(hostname)
914LOGNAME         : $(whoami)
915NCO             : NCO netCDF Operator ${NCO} http://nco.sourceforge.net
916Python version  : ${PYTHON_VER}
917OS              : $(uname -o)
918release         : $(uname -r)
919hardware        : $(uname -i)
920EOF
921
922echo 'SVN Information : ' >> README.txt
923echo '$Author$ ' >> README.txt
924echo '$Date$ ' >> README.txt
925echo '$Revision$ ' >> README.txt
926echo '$Id$ ' >> README.txt
927echo '$HeadURL$ ' >> README.txt
928
929echo ${Titre}"Compute checksums and add them to README"${Norm}
930# ------------------------------------------------------------
931cat << EOF >> README.txt
932
933Files produced, with checksum produced by Unix command shasum (version $(shasum --version)) with default algorithm
934
935EOF
936
937for file in $(ls dia_*.nc rmp_*.nc ${ATM}_grid_maskFrom_${OCE}*.nc areas_${OCE}x${ATM}*.nc grids_${OCE}x${ATM}*.nc masks_${OCE}x${ATM}*.nc 2> /dev/null ) ; do
938    ncatted --history --attribute uuid,global,o,c,"${UUID}" ${file}
939    echo "$(shasum ${file})" >> README.txt
940done
941
942cat <<EOF >> README.txt
943
944================= That's all folk's ! ========================
945EOF
946
947if [[ "X${Version}" != "X" ]] ; then
948    cp README.txt ${SUBMIT_DIR}/README_${CplModel}_MOSAIX_${Version}.txt
949else
950    cp README.txt ${SUBMIT_DIR}/README_${CplModel}_MOSAIX.txt
951fi
952## ===========================================================================
953##
954echo ${Titre}"     That's all folk's !!!    "${Norm}
955##
956## ===========================================================================
957
Note: See TracBrowser for help on using the repository browser.