#!/bin/ksh #----------------------------------------------------------------- function OCE_Initialize { IGCM_debug_PushStack "OCE_Initialize" RESOL_OCE=${config_UserChoices_ExpType%%_*} EXPTYPE=${config_UserChoices_ExpType##*/} IGCM_debug_Print 1 " " IGCM_debug_Print 1 "RESOL_OCE : ${RESOL_OCE}" IGCM_debug_Print 1 "EXPERIMENT TYPE : ${EXPTYPE}" # Local function to find namelists parameters supergrep () { grep "^ *$1 *=" $2 | sed -e "s% *\!.*%%" } OPA_RDT=$( supergrep rn_rdt ${SUBMIT_DIR}/PARAM/namelist_${RESOL_OCE}${EXPTYPE}_cfg | sed 's/ *rn_rdt *=//' | sed 's/\. *,//' ) # Period Length In Days between DateBegin and first day of calendar 0001 01 01 # /!\ Needed by OPA namelist to compute file names /!\ (( DaysSinceJC = $( IGCM_date_DaysSinceJC ${DateBegin} ) + 1 )) (( OPA_NPDT_DAY = 86400 / OPA_RDT )) (( OPA_NPDT_YEAR = OPA_NPDT_DAY * 365 )) IGCM_debug_Print 1 " " IGCM_debug_Print 1 "OPA_RDT ${OPA_RDT}" IGCM_debug_Print 1 "OPA_NPDT_DAY ${OPA_NPDT_DAY}" IGCM_debug_Print 1 "OPA_NPDT_YEAR ${OPA_NPDT_YEAR}" IGCM_debug_PopStack "OCE_Initialize" } #----------------------------------------------------------------- function OCE_Update { IGCM_debug_PushStack "OCE_Update" if [ "${EXPTYPE}" = "ia" ] ; then NbFileInter=${#opa9_UserChoices_ListForcing[*]} if [ ${year} -ge ${opa9_UserChoices_YearForcingInit} ] ; then year_forcing=${year} else (( LengthForcing=${opa9_UserChoices_YearForcingEnd} - ${opa9_UserChoices_YearForcingInit} + 1 )) (( DiffForcing=${opa9_UserChoices_YearForcingEnd} - ${year} )) (( ModuloForcing=${DiffForcing} % ${LengthForcing} )) (( year_forcing=${opa9_UserChoices_YearForcingEnd} - ${ModuloForcing} )) fi (( year_forcing_m1 = ${year_forcing} - 1)) (( year_forcing_p1 = ${year_forcing} + 1)) (( i = 0 )) while [ $i -lt ${NbFileInter} ] ; do eval file=${opa9_UserChoices_ListForcing[$i]} IGCM_sys_Get ${opa9_UserChoices_R_FORCING}/${file}_${year_forcing_m1}.nc ${file}_y${year_m1}.nc IGCM_sys_Get ${opa9_UserChoices_R_FORCING}/${file}_${year_forcing}.nc ${file}_y${year}.nc IGCM_sys_Get ${opa9_UserChoices_R_FORCING}/${file}_${year_forcing_p1}.nc ${file}_y${year_p1}.nc (( i = i + 1 )) done fi NbFreq=$( echo ${config_OCE_WriteFrequency} | wc -w ) ##--Write Frequency Purpose .... typeset -Z1 i=1 while [ $i -le ${NbFreq} ]; do frequency=$( echo ${config_OCE_WriteFrequency} | awk -v var="$i" "-F " '{print $var}' ) factor=$( echo ${frequency} | sed -e "s/[yYmMdDhH]//" ) case ${frequency} in *Y|*y) eval PREFIX_WF${i}=${config_UserChoices_JobName}_${factor}y_${DatesPeriod} ; eval R_OUT_OCE_WF${i}=${R_OUT_OCE_O_Y} ; eval WF${i}=${factor}Y ;; *M|*m) eval PREFIX_WF${i}=${config_UserChoices_JobName}_${factor}m_${DatesPeriod} ; eval R_OUT_OCE_WF${i}=${R_OUT_OCE_O_M} ; eval WF${i}=${factor}M ;; *D|*d) eval PREFIX_WF${i}=${config_UserChoices_JobName}_${factor}d_${DatesPeriod} ; eval R_OUT_OCE_WF${i}=${R_OUT_OCE_O_D} ; eval WF${i}=${factor}D ;; *H|*h) eval PREFIX_WF${i}=${config_UserChoices_JobName}_${factor}h_${DatesPeriod} ; eval R_OUT_OCE_WF${i}=${R_OUT_OCE_O_H} ; eval WF${i}=${factor}H ;; *) esac let i=$i+1 done # Period Length In Days between DateBegin and first day of calendar 0001 01 01 # Needed by OPA namelist to compute correct file names (( PeriodDaysSinceJC = $( IGCM_date_DaysSinceJC ${PeriodDateBegin} ) + 1 )) ## Count of number of time steps from begin of OPA job (( OPA_NIT000 = ( PeriodDaysSinceJC - DaysSinceJC ) * OPA_NPDT_DAY + 1 )) (( OPA_NDT = PeriodLengthInDays * OPA_NPDT_DAY )) (( OPA_NITEND = OPA_NIT000 + OPA_NDT - 1)) ## Forcing to write one restart file at the end of period OPA_NSTOCK="${OPA_NITEND}" ## Verification of number of time steps per day (( NB_SEC_DAY_MODEL = OPA_NPDT_DAY * OPA_RDT )) (( NB_SEC_DAY = 60 * 60 * 24 )) if [ ${NB_SEC_DAY_MODEL} -ne ${NB_SEC_DAY} ] then echo " NB_SEC_DAY_MODEL "${NB_SEC_DAY_MODEL} "NB_SEC_DAY" ${NB_SEC_DAY} "OPA_NPDT_DAY" ${OPA_NPDT_DAY} "OPA_RDT" ${OPA_RDT} echo " VERIFY OPA_NPDT_DAY in opa9.card " exit fi ##-- Restart configuration if ( [ "${CumulPeriod}" -eq 1 ] && [ "${config_OCE_Restart}" = "n" ] ) ; then #echo "NO OPA RESTART" OPA_LRSTAR=.FALSE. OPA_NRSTDT=0 elif ( [ "${CumulPeriod}" -eq 1 ] && [ "${config_OCE_Restart}" = "y" ] ) ; then #echo "OPA RESTART" OPA_LRSTAR=.TRUE. OPA_NRSTDT=0 else #echo "OPA RESTART" OPA_LRSTAR=.TRUE. OPA_NRSTDT=2 fi OPA_NMSH=0 if [ "${opa9_UserChoices_mesh_mask}" = "y" ]; then OPA_NMSH=1 IGCM_card_WriteOption ${SUBMIT_DIR}/COMP/opa9.card UserChoices mesh_mask "n" fi ## nleapy configuration case ${config_UserChoices_CalendarType} in ( leap|gregorian) OPA_NLEAPY=1 ;; ( noleap ) OPA_NLEAPY=0 ;; ( 360d ) OPA_NLEAPY=30 ;; ( * ) OPA_NLEAPY=30 ;; esac typeset -r PRECIS=8 NEMO_END=$( echo $( awk "BEGIN { printf \"%0${PRECIS}d\",${OPA_NITEND} }" ) ) IGCM_comp_modifyNamelist blocker namelist_cfg cn_exp ${config_UserChoices_JobName} IGCM_comp_modifyNamelist blocker namelist_cfg nn_it000 ${OPA_NIT000} IGCM_comp_modifyNamelist blocker namelist_cfg nn_itend ${OPA_NITEND} IGCM_comp_modifyNamelist blocker namelist_cfg ln_rstart ${OPA_LRSTAR} IGCM_comp_modifyNamelist blocker namelist_cfg nn_stock ${OPA_NSTOCK} IGCM_comp_modifyNamelist blocker namelist_cfg nn_rstctl ${OPA_NRSTDT} IGCM_comp_modifyNamelist blocker namelist_cfg nn_date0 ${PeriodDateBegin} IGCM_comp_modifyNamelist nonblocker namelist_cfg nn_msh ${OPA_NMSH} IGCM_comp_modifyNamelist blocker namelist_cfg nn_leapy ${OPA_NLEAPY} # update domain_def.xml file case ${RESOL_OCE} in ( *ORCA025* ) sed -e 's/ domain_def.xml.tmp IGCM_sys_Mv domain_def.xml.tmp domain_def_nemo.xml ; esac IGCM_debug_PopStack "OCE_Update" } #----------------------------------- function OCE_Finalize { IGCM_debug_PushStack "OCE_Finalize" if [ -f date.file ] ; then # Prefix use in opa.card AND in lim2.card : DATE_OPA=$( cat date.file | \ sed "s/\ ${config_UserChoices_JobName}_[0-9]*[a-z]_\([0-9]*_[0-9]*\)_\ */\1/g" ) ###DATE_OPA=$( $DATE_OPABF | cut -c1-30 ) MainPrefix=${config_UserChoices_JobName}_1d_${DATE_OPA} SecondPrefix=${config_UserChoices_JobName}_5d_${DATE_OPA} fi echo FINALIZE OCE !!! IGCM_debug_PopStack "OCE_Finalize" }