2** include file
"globaldef.h"
5********************************************************** hernan g. arango ***
6** copyright(c) 2002-2025 the roms group alexander f. shchepetkin **
7** licensed under a mit/x style license **
8** see license_roms.md **
9*******************************************************************************
11** warning: this file
contains a set of predetermined macro definitions **
12** ======= which are inserted into the individual files by c-preprocessor. **
13** it is strongly recommended to not modify any of the definitions below. **
15*******************************************************************************
19** set assumed-shape array switch. imported arrays with dummy
20** arguments that takes the shape of the actual argument passed
21** to it.
If off, all the arrays are explicit-shape. in some
22** computer explicit-shape arrays slow down performacnce because
23** the arrays are copied when passed by arguments.
26#if !((defined G95 && defined I686) || defined UNICOS_SN)
31** set switch for computer lacking 4-byte(32 bit) floating point
32** representation, like some crays. this becomes important when
33** defining attributes for 4-byte float variables in netcdf files.
34** we need to have the _fillvalue attribute of the same
type as
35** as the netcdf variable.
39# define NO_4BYTE_REALS
43** set internal distributed-
memory switch.
51** make sure that either
"mpi_allgather",
"mpi_allreduce" or lower
52** level point-to-point comunications send/recv are used in
53**
"mp_collect".
Use "mpi_allreduce" as default since it is more
54** efficient in mostly all computers.
58# if !(defined ASSEMBLE_ALLGATHER || \
59 defined assemble_allreduce || \
60 defined assemble_sendrecv)
61# define ASSEMBLE_ALLREDUCE
66** make sure that either
"mpi_allgather" or
"mpi_allreduce" are used
67** in
"mp_boundary".
Use "mpi_allreduce" as default since it is more
68** efficient in mostly all computers.
72# if !(defined BOUNDARY_ALLGATHER || \
73 defined boundary_allreduce)
74# define BOUNDARY_ALLREDUCE
79** make sure that either
"mpi_allgather",
"mpi_allreduce" or lower
80** level point-to-point comunications send/recv are used in
81**
"mp_collect".
Use "mpi_allreduce" as default since it is more
82** efficient in mostly all computers.
86# if !(defined COLLECT_ALLGATHER || \
87 defined collect_allreduce || \
88 defined collect_sendrecv)
89# define COLLECT_ALLREDUCE
94** make sure that either
"mpi_allgather",
"mpi_allreduce" or lower
95** level point-to-point comunications send/recv are used in
96**
"mp_reduce".
Use "mpi_allreduce" as default since it is more
97** efficient in mostly all computers.
101# if !(defined REDUCE_ALLGATHER || \
102 defined reduce_allreduce || \
103 defined reduce_sendrecv)
104# define REDUCE_ALLREDUCE
109** turn on/off time profiling.
115** set default time-averaging filter for barotropic fields.
125** turn on/off switch to include/disregard the difference between
126** rho0 and surface density in the computation of baroclinic pressure
133** turn on/off
double precision arithmetic in numerical kernel (default)
134** and floating-point
type variables and
associated intrinsic functions.
137#ifdef SINGLE_PRECISION
145# define DOUBLE_PRECISION
149** turn on masking when wetting and drying is activated.
152#if !defined MASKING && defined WET_DRY
157**
If wetting and drying, activate limiting of bottom stress.
160#if !defined LIMIT_BSTRESS && defined WET_DRY
161# define LIMIT_BSTRESS
165** define macro for the first 2d time-step.
169# define FIRST_2D_STEP iif(ng).eq.1
170# define FIRST_TIME_STEP iic(ng).eq.ntfirst(ng)
172# define FIRST_2D_STEP iic(ng).eq.ntfirst(ng)
176** set switch for distributed-
memory applications to gather and scatter
177** i/o
data in 2d slabs. this is necessary on some platforms to conserve
181#if defined DISTRIBUTE
182# if defined UNICOS_SN
188** remove openmp directives in serial and distributed
memory
189** applications. this definition will be used in conjunction with
190** the pearl script
"cpp_clean" to remove the full directive.
198** set tile range for distributed- or shared-
memory configurations.
202# define THREAD_RANGE MyRank,MyRank
204# define THREAD_RANGE 0,numthreads-1
208** choice of double/single precision for real
type variables and
209**
associated intrinsic functions.
212#if (defined CRAY || defined CRAYT3E) && !defined CRAYX1
213# ifdef DOUBLE_PRECISION
214# undef DOUBLE_PRECISION
218#ifdef DOUBLE_PRECISION
220# define PDNAUPD pdnaupd
221# define PDNEUPD pdneupd
222# define PDSAUPD pdsaupd
223# define PDSEUPD pdseupd
224# define PDNORM2 pdnorm2
226# define DNAUPD dnaupd
227# define DNEUPD dneupd
228# define DSAUPD dsaupd
229# define DSEUPD dseupd
233# define DSTEQR dsteqr
236# define PDNAUPD psnaupd
237# define PDNEUPD psneupd
238# define PDSAUPD pssaupd
239# define PDSEUPD psseupd
240# define PDNORM2 psnorm2
242# define DNAUPD snaupd
243# define DNEUPD sneupd
244# define DSAUPD ssaupd
245# define DSEUPD sseupd
249# define DSTEQR ssteqr
253** single
intrinsic fortran functions.
256#ifdef SINGLE_PRECISION
261** check for 4d-var deprecated cpp options.
270#ifdef IS4DVAR_SENSITIVITY
271# ifndef I4DVAR_ANA_SENSITIVITY
272# define I4DVAR_ANA_SENSITIVITY
282#ifdef W4DPSAS_SENSITIVITY
283# ifndef RBL4DVAR_ANA_SENSITIVITY
284# define RBL4DVAR_ANA_SENSITIVITY
288#ifdef W4DPSAS_FCT_SENSITIVITY
289# ifndef RBL4DVAR_FCT_SENSITIVITY
290# define RBL4DVAR_FCT_SENSITIVITY
300#ifdef W4DVAR_SENSITIVITY
301# ifndef R4DVAR_ANA_SENSITIVITY
302# define R4DVAR_ANA_SENSITIVITY
307** set multiple excutables split 4d-var.
310#if defined SPLIT_I4DVAR || \
311 defined split_rbl4dvar || \
312 defined split_r4dvar || \
313 defined split_sp4dvar
318**
If split 4d-var, activate the unsplit option since both share
319** identical configuration to avoid too many directives changes.
322#if !defined I4DVAR && defined SPLIT_I4DVAR
326#if !defined RBL4DVAR && defined SPLIT_RBL4DVAR
330#if !defined R4DVAR && defined SPLIT_R4DVAR
334#if !defined SP4DVAR && defined SPLIT_SP4DVAR
340** set 4d-var sensitivity switch.
343#if defined RBL4DVAR_ANA_SENSITIVITY || \
344 defined rbl4dvar_fct_sensitivity || \
345 defined r4dvar_ana_sensitivity
346# define SENSITIVITY_4DVAR
349#if (defined RBL4DVAR && \
350 defined obs_space) || \
351 (defined split_rbl4dvar && \
357** set perturbation tangent linear, fine amplitude tangent linear,
358** and adjoint model switches.
361#if defined ARRAY_MODES || \
362 defined clipping || \
363 defined correlation || \
364 defined forcing_sv || \
365 defined ft_eigenmodes || \
366 defined hessian_fsv || \
367 defined hessian_so || \
368 defined hessian_sv || \
369 defined inner_product || \
371 defined i4dvar_ana_sensitivity || \
373 defined opt_perturbation || \
374 defined opt_observations || \
375 defined picard_test || \
376 defined rbl4dvar || \
377 defined rpm_driver || \
379 defined r_symmetry || \
380 defined sanity_check || \
381 defined sensitivity_4dvar || \
382 defined split_i4dvar || \
383 defined split_rbl4dvar || \
384 defined split_r4dvar || \
385 defined split_sp4dvar || \
387 defined stochastic_opt || \
388 defined tlm_check || \
389 defined tlm_driver || \
390 defined tl_rbl4dvar || \
395#if defined AD_SENSITIVITY || \
396 defined adm_driver || \
397 defined aft_eigenmodes || \
398 defined array_modes || \
399 defined clipping || \
400 defined correlation || \
401 defined forcing_sv || \
402 defined hessian_so || \
403 defined hessian_fsv || \
404 defined hessian_sv || \
405 defined inner_product || \
407 defined i4dvar_ana_sensitivity || \
409 defined opt_perturbation || \
410 defined opt_observations || \
411 defined rbl4dvar || \
413 defined r_symmetry || \
414 defined sanity_check || \
415 defined sensitivity_4dvar || \
417 defined split_i4dvar || \
418 defined split_rbl4dvar || \
419 defined split_r4dvar || \
420 defined split_sp4dvar || \
422 defined stochastic_opt || \
423 defined tlm_check || \
424 defined tl_rbl4dvar || \
429#if defined ARRAY_MODES || \
430 defined clipping || \
431 defined picard_test || \
432 defined rpm_driver || \
433 defined tl_r4dvar || \
435 defined r4dvar_ana_sensitivity
439#if !defined ANA_PERTURB && \
440 (defined correlation || \
441 defined sanity_check || \
447** turn off nonlinear model switch.
451#if defined AD_SENSITIVITY || \
452 defined aft_eigenmodes || \
453 defined forcing_sv || \
454 defined ft_eigenmodes || \
455 defined hessian_fsv || \
456 defined hessian_so || \
457 defined hessian_sv || \
458 defined inner_product || \
459 defined opt_observations || \
460 defined opt_perturbation || \
461 defined picard_test || \
462 defined sanity_check || \
464 defined stochastic_opt
469** activate switch for full adjoint
output solution. due to the
470** predictor/corrector and multiple time level schemes, pieces of
471** the adjoint solution are in two-time levels and need to be added
472** in the
"_sol" arrays for
output purposes.
476# if !defined AD_OUTPUT_STATE && \
477 (defined stochastic_opt &&
478# define AD_OUTPUT_STATE
483** activate bacroclinic pressure gradient response due to the
484** perturbation of free-surface in the presence of stratification
485** and bathymetry. this option does not pass the sanity check
486** in adjoint and tangent linear applications, so we
use not_yet
487** in tlm, rpm, and adm kernels.
495** set
output index for multi-time levels variables.
499# if defined TANGENT || defined TL_IOMS
500# define TKOUT kstp(ng)
501# define KOUT kstp(ng)
502# define NOUT nrhs(ng)
504# define KOUT kstp(ng)
505# define NOUT nrhs(ng)
508# define IOUT linew(ng)
509# define IUOUT liunw(ng)
510# define IEOUT lienw(ng)
513# if defined TANGENT || defined TL_IOMS
514# define TKOUT kstp(ng)
516# define KOUT knew(ng)
520** set internal switch for the need of a propagator driver.
523#if defined AFT_EIGENMODES || \
524 defined ensemble || \
525 defined forcing_sv || \
526 defined ft_eigenmodes || \
527 defined hessian_fsv || \
528 defined hessian_so || \
529 defined hessian_sv || \
530 defined opt_perturbation || \
531 defined pseudospectra || \
533 defined so_trace || \
534 defined stochastic_opt
539** activate processing of forward vertical mixing.
543#if !defined FORWARD_MIXING && \
544 (defined tangent || \
546 defined adjoint) && \
547 (defined lmd_mixing || \
548 defined gls_mixing || \
551 define forward_mixing
556** set internal switches for all the 4dvar schemes.
559#if !defined WEAK_CONSTRAINT && \
560 (defined array_modes || \
561 defined clipping || \
563 defined rbl4dvar || \
564 defined rbl4dvar_fct_sensitivity || \
565 defined rbl4dvar_ana_sensitivity || \
567 defined r4dvar_ana_sensitivity || \
568 defined r_symmetry || \
569 defined split_rbl4dvar || \
570 defined split_r4dvar || \
571 defined split_sp4dvar || \
573 defined tl_rbl4dvar || \
575# define WEAK_CONSTRAINT
578#if !defined WEAK_CONSTRAINT && defined RPM_RELAXATION
579# undef RPM_RELAXATION
582#if defined CORRELATION || \
583 defined hessian_fsv || \
584 defined hessian_so || \
585 defined hessian_sv || \
587 defined i4dvar_ana_sensitivity || \
588 defined opt_observations || \
589 defined tlm_check || \
590 defined weak_constraint
598#if !(defined RBL4DVAR || defined R4DVAR) && defined POSTERIOR_EOFS
599# undef POSTERIOR_EOFS
602#if !(defined RBL4DVAR || defined R4DVAR) && defined POSTERIOR_ERROR_F
603# undef POSTERIOR_ERROR_F
606#if !(defined RBL4DVAR || defined R4DVAR) && defined POSTERIOR_ERROR_I
607# undef POSTERIOR_ERROR_I
610#if !(defined WEAK_CONSTRAINT || defined I4DVAR_ANA_SENSITIVITY) && \
615#if !(defined OBS_IMPACT && \
616 (defined i4dvar_ana_sensitivity || \
617 defined rbl4dvar_ana_sensitivity || \
618 defined rbl4dvar_fct_sensitivity || \
619 defined r4dvar_ana_sensitivity))
624** activate internal switch to process 4dvar observations.
627#if defined ARRAY_MODES || \
628 defined clipping || \
630 defined i4dvar_ana_sensitivity || \
631 defined rbl4dvar || \
633 defined sensitivity_4dvar || \
634 defined split_i4dvar || \
635 defined split_rbl4dvar || \
636 defined split_r4dvar || \
637 defined split_sp4dvar || \
639 defined tlm_check || \
640 defined tl_rbl4dvar || \
641 defined tl_r4dvar || \
646#if defined ARRAY_MODES || \
647 defined clipping || \
649 defined i4dvar_ana_sensitivity || \
650 defined rbl4dvar || \
652 defined r_symmetry || \
653 defined sensitivity_4dvar || \
655 defined tlm_check || \
656 defined tl_rbl4dvar || \
662** activate reading and writting of the basic sate.
665#if !defined FORWARD_READ && \
666 (defined array_modes || \
667 defined clipping || \
669 defined i4dvar_ana_sensitivity || \
670 defined propagator || \
671 defined rbl4dvar || \
673 defined sensitivity_4dvar || \
674 defined split_i4dvar || \
675 defined split_rbl4dvar || \
676 defined split_r4dvar || \
677 defined split_sp4dvar || \
679 defined tl_rbl4dvar || \
684#if !defined FORWARD_WRITE && \
685 (defined array_modes || \
686 defined clipping || \
688 defined i4dvar_ana_sensitivity || \
690 defined rbl4dvar || \
692 defined sensitivity_4dvar || \
693 defined split_i4dvar || \
694 defined split_rbl4dvar || \
695 defined split_r4dvar || \
696 defined split_sp4dvar || \
698 defined tl_rbl4dvar || \
700# define FORWARD_WRITE
704** set internal weak constraint switches.
707#ifdef WEAK_CONSTRAINT
712** set in internal switch to activate computation of nonlinear
713** equation of state expnasion polynomial t-derivatives.
716#if defined ADJOINT || \
717 defined bulk_fluxes || \
722# define EOS_TDERIVATIVE
726**
If splines, deactivate horizontal and vertical smoothing of
727** richardson number horizontally and/or vertically.
731# if defined LMD_MIXING
738** activate internal switch for the computation of the brunt-vaisala
742#if defined BVF_MIXING || \
743 defined gls_mixing || \
744 defined lmd_mixing || \
752** activate internal switch for bottom boundary layer closure.
755#if defined MB_BBL || \
762** check
if spatially varying bottom friction parameters are needed.
765#if defined UV_DRAG_GRID && \
767 defined sediment || \
768 defined uv_logdrag || \
769 defined uv_ldrag || \
774#if defined ANA_DRAG && \
780** activate internal option for seaice model.
785# if defined ICE_ADVECT
788# if defined ICE_MOMENTUM
791# if defined ICE_THERMO
797** activate internal biology option when using any
type of biological
801#if defined BIO_FENNEL || \
803 defined hypoxia_srm || \
805 defined npzd_franks || \
806 defined npzd_iron || \
807 defined npzd_powell || \
813** activate internal option for biological float behavior.
816#if defined FLOATS && \
818# define FLOAT_BIOLOGY
822** define internal option to couple to other models.
826#if defined COAMPS_COUPLING || \
827 defined regcm_coupling || \
835#if defined CICE_COUPLING
839#if defined REFDIF_COUPLING || \
840 defined swan_coupling || \
845#if defined ATM_COUPLING || \
847 defined data_coupling || \
848 defined ice_coupling || \
850# define MODEL_COUPLING
853#if defined MODEL_COUPLING && \
854 defined esmf_lib && \
856# define REGRESS_STARTCLOCK
857# define ESM_SETRUNCLOCK
861** define internal option for waves effect on currents.
868#if defined SSW_LOGINT && defined WEC
869# define SSW_LOGINT_STOKES
873# if defined SWAN_COUPLING
874# define SPECTRUM_STOKES
881** define internal option to process wave data.
884#if (defined ROLLER_SVENDSEN || defined ROLLER_MONO || \
885 defined roller_reniers) && defined wec
889#if defined BBL_MODEL || \
890 defined wav_coupling || \
896#if defined BBL_MODEL && \
898 defined mb_calc_ub || \
903#if (defined BBL_MODEL && \
905 defined bedload_soulsby || \
906 defined bedload_vandera || \
907 defined coare_taylor_yelland || \
909 defined wav_coupling || \
915#if defined BEDLOAD_SOULSBY || \
916 defined bedload_vandera || \
917 defined wav_coupling || \
922#if (!defined DEEPWATER_WAVES && \
923 (defined coare_taylor_yelland || \
924 defined coare_oost || \
926# define WAVES_LENGTHP
929#if defined COARE_TAYLOR_YELLAND || \
930 defined coare_oost || \
934# define WAVES_TOP_PERIOD
937#if defined BBL_MODEL || \
939# define WAVES_BOT_PERIOD
942#if (defined TKE_WAVEDISS || defined WEC_VF) && \
950#if defined WAVES_BOT_PERIOD || \
951 defined waves_dir || \
952 defined waves_dirp || \
953 defined waves_dspr || \
954 defined waves_length || \
955 defined waves_lengthp || \
956 defined waves_height || \
957 defined waves_top_period
961#if !defined WAV_COUPLING && \
962 ((defined bulk_fluxes && \
963 defined coare_taylor_yelland) || \
964 (defined bulk_fluxes && \
965 defined coare_oost) || \
966 defined tke_wavediss || \
967 defined wave_diss || \
968 defined waves_dir || \
969 defined waves_bot_period || \
970 defined waves_height || \
971 defined waves_length || \
972 defined waves_lengthp || \
973 defined waves_top_period || \
979** define internal option for bedload treatment.
982#if defined BEDLOAD_MPM || \
983 defined bedload_soulsby || \
984 defined bedload_vandera
989** define internal flag indicating processing of input forcing
1002# if !defined ANA_BTFLUX || \
1007 ( defined biology &&
1008 ( defined biology &&
1010 defined bulk_fluxes &&
1012 defined bulk_fluxes &&
1014 defined bulk_fluxes &&
1016 defined bulk_fluxes &&
1018 defined bulk_fluxes &&
1020 defined bulk_fluxes &&
1022 defined bulk_fluxes &&
1024 defined bulk_fluxes &&
1028 defined red_tide) || \
1032 (defined bulk_fluxes &&
1034 defined solar_source &&
1035 ( defined bbl_model && (
1037 ( defined sediment &&
1038 ( defined sediment &&
1039 ( defined wave_data && (
1044# if(!defined FRC_COUPLING && !defined ANA_SMFLUX)
1050** check analytical
initial conditions options.
1053#if defined ANA_BIOLOGY && \
1058#if defined ANA_PASSIVE && \
1063#if defined ANA_SEDIMENT && \
1069#if !defined ANA_INITIAL || \
1070 (defined biology && \
1072 (defined t_passive && \
1074 (defined sediment && \
1076 (defined bbl_model && \
1082** define internal shortwave radiation option. undefine analytical
1083** shortwave option
if not needed.
1086#if defined BIOLOGY || \
1087 defined bulk_fluxes || \
1089 defined solar_source
1093#if !defined SHORTWAVE && \
1098#if !defined SHORTWAVE && \
1099 defined diurnal_srflux
1100# undef DIURNAL_SRFLUX
1104** define internal clouds option. undefine analytical
1105** shortwave option
if not needed.
1108#if (defined ANA_SRFLUX && \
1109 defined albedo) || \
1110 (defined bulk_fluxes && \
1111 defined longwave) || \
1116#if !defined CLOUDS && \
1122** check
if it is meaningful to
write out momentum/tracer diagnostics
1123** and activate internal diagnostics option.
1126#if !defined SOLVE3D || \
1128# if defined DIAGNOSTICS_TS
1129# undef DIAGNOSTICS_TS
1133#if defined DIAGNOSTICS_BIO && \
1136 defined hypoxia_srm)
1137# undef DIAGNOSTICS_BIO
1140#if defined DIAGNOSTICS_BIO || \
1141 defined diagnostics_ts || \
1142 defined diagnostics_uv
1147** check
if any analytical expression is defined.
1150#if defined ANA_BIOLOGY || \
1151 defined ana_bpflux || \
1152 defined ana_bsflux || \
1153 defined ana_btflux || \
1154 defined ana_cloud || \
1155 defined ana_diag || \
1156 defined ana_dqdsst || \
1157 defined ana_drag || \
1158 defined ana_fsobc || \
1160 defined ana_humidity || \
1161 defined ana_initial || \
1162 defined ana_m2clima || \
1163 defined ana_m2obc || \
1164 defined ana_m3clima || \
1165 defined ana_m3obc || \
1166 defined ana_mask || \
1167 defined ana_nudgcoef || \
1168 defined ana_pair || \
1169 defined ana_passive || \
1170 defined ana_perturb || \
1171 defined ana_psource || \
1172 defined ana_rain || \
1173 defined ana_respiration || \
1174 defined ana_sediment || \
1175 defined ana_smflux || \
1176 defined ana_spflux || \
1177 defined ana_spinning || \
1178 defined ana_sponge || \
1179 defined ana_srflux || \
1180 defined ana_ssflux || \
1181 defined ana_ssh || \
1182 defined ana_sss || \
1183 defined ana_sst || \
1184 defined ana_stflux || \
1185 defined ana_tair || \
1186 defined ana_tclima || \
1187 defined ana_tobc || \
1188 defined ana_vmix || \
1189 defined ana_winds || \
1190 defined ana_wwave || \
1191 defined diff_grid || \
1197**
If splitting 3rd-order upstream bias horizontal advection of
1198** momentum, activate other needed flags.
1201#ifdef UV_U3ADV_SPLIT
1203# ifndef UV_C4ADVECTION
1204# define UV_C4ADVECTION
1212# ifdef UV_SMAGORINSKY
1213# undef UV_SMAGORINSKY
1218** define internal switch for smagorinsky-like mixing.
1221#if !defined DIFF_3DCOEF && defined TS_SMAGORINSKY
1224#if !defined VISC_3DCOEF && defined UV_SMAGORINSKY
subroutine ana_grid(ng, tile, model)
subroutine lmd_bkpp(ng, tile)
subroutine lmd_skpp(ng, tile)