rompy.swan.components.group.PHYSICS#

pydantic model rompy.swan.components.group.PHYSICS[source]#

Physics group component.

The physics group component is a convenience to allow specifying several individual components in a single command and check for consistency between them.

Exemples#

In [49]: from rompy.swan.components.group import PHYSICS

In [50]: gen = {"model_type": "gen3", "source_terms": {"model_type": "komen"}}

In [51]: phys = PHYSICS(gen=gen)

In [52]: print(phys.render())
GEN3 KOMEN DRAG WU

In [53]: phys = PHYSICS(
   ....:     gen=dict(model_type="gen3", source_terms={"model_type": "st6c1"}),
   ....:     negatinp={"model_type": "negatinp", "rdcoef": 0.04},
   ....:     sswell={"model_type": "zieger"},
   ....:     breaking={"model_type": "constant", "alpha": 1.0, "gamma": 0.73},
   ....:     friction={"model_type": "jonswap", "cfjon": 0.038},
   ....: )
   ....: 

In [54]: print(phys.render())
GEN3 ST6 a1sds=4.7e-07 a2sds=6.6e-06 p1sds=4.0 p2sds=4.0 UP HWANG VECTAU U10PROXY windscaling=28.0 AGROW

SSWELL ZIEGER

NEGATINP rdcoef=0.04

BREAKING CONSTANT alpha=1.0 gamma=0.73

FRICTION JONSWAP CONSTANT cfjon=0.038

Show JSON schema
{
   "title": "PHYSICS",
   "description": "Physics group component.\n\nThe physics group component is a convenience to allow specifying several individual\ncomponents in a single command and check for consistency between them.\n\nExemples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.group import PHYSICS\n    gen = {\"model_type\": \"gen3\", \"source_terms\": {\"model_type\": \"komen\"}}\n    phys = PHYSICS(gen=gen)\n    print(phys.render())\n    phys = PHYSICS(\n        gen=dict(model_type=\"gen3\", source_terms={\"model_type\": \"st6c1\"}),\n        negatinp={\"model_type\": \"negatinp\", \"rdcoef\": 0.04},\n        sswell={\"model_type\": \"zieger\"},\n        breaking={\"model_type\": \"constant\", \"alpha\": 1.0, \"gamma\": 0.73},\n        friction={\"model_type\": \"jonswap\", \"cfjon\": 0.038},\n    )\n    print(phys.render())",
   "type": "object",
   "properties": {
      "model_type": {
         "default": "physics",
         "description": "Model type discriminator",
         "enum": [
            "physics",
            "PHYSICS"
         ],
         "title": "Model Type",
         "type": "string"
      },
      "gen": {
         "anyOf": [
            {
               "description": "Wave generation component",
               "discriminator": {
                  "mapping": {
                     "GEN1": "#/$defs/GEN1",
                     "GEN2": "#/$defs/GEN2",
                     "GEN3": "#/$defs/GEN3",
                     "gen1": "#/$defs/GEN1",
                     "gen2": "#/$defs/GEN2",
                     "gen3": "#/$defs/GEN3"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/GEN1"
                  },
                  {
                     "$ref": "#/$defs/GEN2"
                  },
                  {
                     "$ref": "#/$defs/GEN3"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Gen"
      },
      "sswell": {
         "anyOf": [
            {
               "description": "Swell dissipation component",
               "discriminator": {
                  "mapping": {
                     "ARDHUIN": "#/$defs/SSWELL_ARDHUIN",
                     "ROGERS": "#/$defs/SSWELL_ROGERS",
                     "ZIEGER": "#/$defs/SSWELL_ZIEGER",
                     "ardhuin": "#/$defs/SSWELL_ARDHUIN",
                     "rogers": "#/$defs/SSWELL_ROGERS",
                     "zieger": "#/$defs/SSWELL_ZIEGER"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/SSWELL_ROGERS"
                  },
                  {
                     "$ref": "#/$defs/SSWELL_ARDHUIN"
                  },
                  {
                     "$ref": "#/$defs/SSWELL_ZIEGER"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Sswell"
      },
      "negatinp": {
         "anyOf": [
            {
               "$ref": "#/$defs/NEGATINP",
               "description": "Negative wind input component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "wcapping": {
         "anyOf": [
            {
               "description": "Whitecapping component",
               "discriminator": {
                  "mapping": {
                     "AB": "#/$defs/WCAPPING_AB",
                     "KOMEN": "#/$defs/WCAPPING_KOMEN",
                     "ab": "#/$defs/WCAPPING_AB",
                     "komen": "#/$defs/WCAPPING_KOMEN"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/WCAPPING_KOMEN"
                  },
                  {
                     "$ref": "#/$defs/WCAPPING_AB"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Wcapping"
      },
      "quadrupl": {
         "anyOf": [
            {
               "$ref": "#/$defs/QUADRUPL",
               "description": "Quadruplets component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "breaking": {
         "anyOf": [
            {
               "description": "Wave breaking component",
               "discriminator": {
                  "mapping": {
                     "BKD": "#/$defs/BREAKING_BKD",
                     "CONSTANT": "#/$defs/BREAKING_CONSTANT",
                     "bkd": "#/$defs/BREAKING_BKD",
                     "constant": "#/$defs/BREAKING_CONSTANT"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/BREAKING_CONSTANT"
                  },
                  {
                     "$ref": "#/$defs/BREAKING_BKD"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Breaking"
      },
      "friction": {
         "anyOf": [
            {
               "description": "Bottom friction component",
               "discriminator": {
                  "mapping": {
                     "COLLINS": "#/$defs/FRICTION_COLLINS",
                     "JONSWAP": "#/$defs/FRICTION_JONSWAP",
                     "MADSEN": "#/$defs/FRICTION_MADSEN",
                     "RIPPLES": "#/$defs/FRICTION_RIPPLES",
                     "collins": "#/$defs/FRICTION_COLLINS",
                     "jonswap": "#/$defs/FRICTION_JONSWAP",
                     "madsen": "#/$defs/FRICTION_MADSEN",
                     "ripples": "#/$defs/FRICTION_RIPPLES"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/FRICTION_JONSWAP"
                  },
                  {
                     "$ref": "#/$defs/FRICTION_COLLINS"
                  },
                  {
                     "$ref": "#/$defs/FRICTION_MADSEN"
                  },
                  {
                     "$ref": "#/$defs/FRICTION_RIPPLES"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Friction"
      },
      "triad": {
         "anyOf": [
            {
               "description": "Triad interactions component",
               "discriminator": {
                  "mapping": {
                     "DCTA": "#/$defs/TRIAD_DCTA",
                     "LTA": "#/$defs/TRIAD_LTA",
                     "SPB": "#/$defs/TRIAD_SPB",
                     "TRIAD": "#/$defs/TRIAD",
                     "dcta": "#/$defs/TRIAD_DCTA",
                     "lta": "#/$defs/TRIAD_LTA",
                     "spb": "#/$defs/TRIAD_SPB",
                     "triad": "#/$defs/TRIAD"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/TRIAD"
                  },
                  {
                     "$ref": "#/$defs/TRIAD_DCTA"
                  },
                  {
                     "$ref": "#/$defs/TRIAD_LTA"
                  },
                  {
                     "$ref": "#/$defs/TRIAD_SPB"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Triad"
      },
      "vegetation": {
         "anyOf": [
            {
               "$ref": "#/$defs/VEGETATION",
               "description": "Vegetation component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "mud": {
         "anyOf": [
            {
               "$ref": "#/$defs/MUD",
               "description": "Mud component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "sice": {
         "anyOf": [
            {
               "description": "Sea ice component",
               "discriminator": {
                  "mapping": {
                     "D15": "#/$defs/SICE_D15",
                     "M18": "#/$defs/SICE_M18",
                     "R19": "#/$defs/SICE_R19",
                     "R21B": "#/$defs/SICE_R21B",
                     "SICE": "#/$defs/SICE",
                     "d15": "#/$defs/SICE_D15",
                     "m18": "#/$defs/SICE_M18",
                     "r19": "#/$defs/SICE_R19",
                     "r21b": "#/$defs/SICE_R21B",
                     "sice": "#/$defs/SICE"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/SICE"
                  },
                  {
                     "$ref": "#/$defs/SICE_R19"
                  },
                  {
                     "$ref": "#/$defs/SICE_D15"
                  },
                  {
                     "$ref": "#/$defs/SICE_M18"
                  },
                  {
                     "$ref": "#/$defs/SICE_R21B"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Sice"
      },
      "turbulence": {
         "anyOf": [
            {
               "$ref": "#/$defs/TURBULENCE",
               "description": "Turbulence component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "bragg": {
         "anyOf": [
            {
               "description": "Bragg scattering component",
               "discriminator": {
                  "mapping": {
                     "BRAGG": "#/$defs/BRAGG",
                     "FILE": "#/$defs/BRAGG_FILE",
                     "FT": "#/$defs/BRAGG_FT",
                     "bragg": "#/$defs/BRAGG",
                     "file": "#/$defs/BRAGG_FILE",
                     "ft": "#/$defs/BRAGG_FT"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/BRAGG"
                  },
                  {
                     "$ref": "#/$defs/BRAGG_FT"
                  },
                  {
                     "$ref": "#/$defs/BRAGG_FILE"
                  }
               ]
            },
            {
               "type": "null"
            }
         ],
         "default": null,
         "title": "Bragg"
      },
      "limiter": {
         "anyOf": [
            {
               "$ref": "#/$defs/LIMITER",
               "description": "Limiter component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "obstacle": {
         "anyOf": [
            {
               "$ref": "#/$defs/OBSTACLES",
               "description": "Obstacle group component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "setup": {
         "anyOf": [
            {
               "$ref": "#/$defs/SETUP",
               "description": "Setup component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "diffraction": {
         "anyOf": [
            {
               "$ref": "#/$defs/DIFFRACTION",
               "description": "Diffraction component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "surfbeat": {
         "anyOf": [
            {
               "$ref": "#/$defs/SURFBEAT",
               "description": "Surfbeat component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "scat": {
         "anyOf": [
            {
               "$ref": "#/$defs/SCAT",
               "description": "Scattering component"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      },
      "deactivate": {
         "anyOf": [
            {
               "$ref": "#/$defs/OFFS",
               "description": "Deactivate components"
            },
            {
               "type": "null"
            }
         ],
         "default": null
      }
   },
   "$defs": {
      "BRAGG": {
         "additionalProperties": false,
         "description": "Bragg scattering.\n\n.. code-block:: text\n\n    BRAGG [ibrag] [nreg] [cutoff]\n\nUsing this optional command, the user activates a source term to represent the\nscattering of waves due to changes in the small-scale bathymetry based on the\ntheory of Ardhuin and Herbers (2002). If this command is not used, SWAN will not\naccount for Bragg scattering.\n\nThe underlying process is related to the bed elevation spectrum that describes the\nrandom variability of the bathymetry at the scale of the wave length on top of a\nslowly varying depth. To input this spectrum in the model, two options are\navailable. One option is to read a spectrum from a file. This single bottom\nspectrum will subsequently be applied in all active grid points. The assumption\nbeing made here is that the inputted bottom is gently sloping. Note that the bottom\nspectrum must be given as a function of the wave number `k`.\n\nAnother option is to compute the spectrum by a Fourier transform from `x` to `k` of\nthe bed modulations around a computational grid point. First, one must define a\nsquare region with a fixed size around the grid point in order to perform the\nFourier transform. The size should correspond to a multiple of the wave length at\nwhich refraction is resolved (i.e. consistent with the mild slope assumption).\nNext, the amplitude modulation of the small-scale bathymetry is obtained by\nsubstracting a slowly varying bed level from the inputted high-resolution\nbathymetric data within this square region. Here, the smooth bed level is achieved\nusing a bilinear fit. During the computation, however, SWAN employs the gently\nsloping bed as the mean of the original bathymetry within the given square around\neach computational grid point. Finally, the corresponding bottom spectrum is\ncomputed with an FFT.\n\nNotes\n-----\nThe Bragg scattering source term to the action balance equation gives rise to a\nfairly stiff equation. The best remedy is to run SWAN in the nonstationary mode\nwith a relatively small time step or in the stationary mode with some under\nrelaxation (see command `NUM STAT [alfa]`).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import BRAGG\n    bragg = BRAGG(nreg=200)\n    print(bragg.render())\n    bragg = BRAGG(ibrag=1, nreg=200, cutoff=5.0)\n    print(bragg.render())",
         "properties": {
            "model_type": {
               "default": "bragg",
               "description": "Model type discriminator",
               "enum": [
                  "bragg",
                  "BRAGG"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "ibrag": {
               "anyOf": [
                  {
                     "enum": [
                        1,
                        2,
                        3
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Indicates the computation of Bragg scattering term:\n\n* 1: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number a priori (thus requiring storage)\n* 2: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number per sweep (no storage)\n* 3: source term is calculated per iteration and bottom spectrum is interpolated at the difference wave number per iteration (no storage)\n\n(SWAN default: 1)",
               "title": "Ibrag"
            },
            "nreg": {
               "description": "Size of square region around computational grid point (centered) for computing the mean depth and, if desired, the bed elevation spectrum. It is expressed in terms of the number of grid points (per direction) of the inputted bottom grid",
               "title": "Nreg",
               "type": "integer"
            },
            "cutoff": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Cutoff to the ratio between surface and bottom wave numbers. Note: seethe Scientific/Technical documentation for details (SWAN default: 5.0)",
               "title": "Cutoff"
            }
         },
         "required": [
            "nreg"
         ],
         "title": "BRAGG",
         "type": "object"
      },
      "BRAGG_FILE": {
         "additionalProperties": false,
         "description": "Bragg scattering with bottom spectrum from file.\n\n.. code-block:: text\n\n    BRAGG [ibrag] [nreg] [cutoff] FILE 'fname' [idla] [mkx] [mky] [dkx] [dky]\n\nThe bed elevation spectrum `FB(kx, ky)` is read from a file.\n\nNotes\n-----\nThis spectrum is taken to be uniform over the entire computational domain.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import BRAGG_FILE\n    bragg = BRAGG_FILE(fname=\"bottom_spectrum.txt\", nreg=500, mkx=99, dkx=0.1)\n    print(bragg.render())\n    kwargs = dict(\n        ibrag=3,\n        nreg=500,\n        cutoff=5.0,\n        fname=\"bottom_spectrum.txt\",\n        mkx=99,\n        mky=149,\n        dkx=0.1,\n        dky=0.1,\n    )\n    bragg = BRAGG_FILE(**kwargs)\n    print(bragg.render())",
         "properties": {
            "model_type": {
               "default": "file",
               "description": "Model type discriminator",
               "enum": [
                  "file",
                  "FILE"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "ibrag": {
               "anyOf": [
                  {
                     "enum": [
                        1,
                        2,
                        3
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Indicates the computation of Bragg scattering term:\n\n* 1: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number a priori (thus requiring storage)\n* 2: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number per sweep (no storage)\n* 3: source term is calculated per iteration and bottom spectrum is interpolated at the difference wave number per iteration (no storage)\n\n(SWAN default: 1)",
               "title": "Ibrag"
            },
            "nreg": {
               "description": "Size of square region around computational grid point (centered) for computing the mean depth and, if desired, the bed elevation spectrum. It is expressed in terms of the number of grid points (per direction) of the inputted bottom grid",
               "title": "Nreg",
               "type": "integer"
            },
            "cutoff": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Cutoff to the ratio between surface and bottom wave numbers. Note: seethe Scientific/Technical documentation for details (SWAN default: 5.0)",
               "title": "Cutoff"
            },
            "fname": {
               "description": "Name of file containing the bottom spectrum",
               "maxLength": 36,
               "title": "Fname",
               "type": "string"
            },
            "idla": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/IDLA"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Order in which the values should be given in the input files"
            },
            "mkx": {
               "description": "Number of cells in x-direction of the wave number grid related to bottom spectrum (this is one less than the number of points in this direction)",
               "title": "Mkx",
               "type": "integer"
            },
            "mky": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Number of cells in y-direction of the wave number grid related to bottom spectrum (this is one less than the number of points in this direction)(SWAN default: `mky = mkx`)",
               "title": "Mky"
            },
            "dkx": {
               "description": "Mesh size in x-direction of the wave number grid related to bottom spectrum (1/m)",
               "title": "Dkx",
               "type": "number"
            },
            "dky": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Mesh size in y-direction of the wave number grid related to bottom spectrum (1/m) (SWAN default: `dky = dkx`)",
               "title": "Dky"
            }
         },
         "required": [
            "nreg",
            "fname",
            "mkx",
            "dkx"
         ],
         "title": "BRAGG_FILE",
         "type": "object"
      },
      "BRAGG_FT": {
         "additionalProperties": false,
         "description": "Bragg scattering with bottom spectrum computed from FFT.\n\n.. code-block:: text\n\n    BRAGG [ibrag] [nreg] [cutoff] FT\n\nIf this keyword is present the bottom spectrum will be computed in each active\ngrid point using a Fast Fourier Transform (FFT).\n\nNotes\n-----\nThe depth in each computational grid point is computed as the average of the\ninputted (high-resolution) bed levels within the square region.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import BRAGG_FT\n    bragg = BRAGG_FT(nreg=350)\n    print(bragg.render())\n    bragg = BRAGG_FT(ibrag=2, nreg=350, cutoff=5.0)\n    print(bragg.render())",
         "properties": {
            "model_type": {
               "default": "ft",
               "description": "Model type discriminator",
               "enum": [
                  "ft",
                  "FT"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "ibrag": {
               "anyOf": [
                  {
                     "enum": [
                        1,
                        2,
                        3
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Indicates the computation of Bragg scattering term:\n\n* 1: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number a priori (thus requiring storage)\n* 2: source term is calculated per sweep and bottom spectrum is interpolated at the difference wave number per sweep (no storage)\n* 3: source term is calculated per iteration and bottom spectrum is interpolated at the difference wave number per iteration (no storage)\n\n(SWAN default: 1)",
               "title": "Ibrag"
            },
            "nreg": {
               "description": "Size of square region around computational grid point (centered) for computing the mean depth and, if desired, the bed elevation spectrum. It is expressed in terms of the number of grid points (per direction) of the inputted bottom grid",
               "title": "Nreg",
               "type": "integer"
            },
            "cutoff": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Cutoff to the ratio between surface and bottom wave numbers. Note: seethe Scientific/Technical documentation for details (SWAN default: 5.0)",
               "title": "Cutoff"
            }
         },
         "required": [
            "nreg"
         ],
         "title": "BRAGG_FT",
         "type": "object"
      },
      "BREAKING_BKD": {
         "additionalProperties": false,
         "description": "Variable wave breaking index.\n\n.. code-block:: text\n\n    BREAKING BKD [alpha] [gamma0] [a1] [a2] [a3]\n\nIndicates that the breaker index scales with both the bottom slope (`beta`)\nand the dimensionless depth (kd).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import BREAKING_BKD\n    breaking = BREAKING_BKD()\n    print(breaking.render())\n    breaking = BREAKING_BKD(alpha=1.0, gamma0=0.54, a1=7.59, a2=-8.06, a3=8.09)\n    print(breaking.render())",
         "properties": {
            "model_type": {
               "default": "bkd",
               "description": "Model type discriminator",
               "enum": [
                  "bkd",
                  "BKD"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "alpha": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient of the rate of dissipation (SWAN default: 1.0)",
               "title": "Alpha"
            },
            "gamma0": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The reference $gamma$ for horizontal slopes (SWAN default: 0.54)",
               "title": "Gamma0"
            },
            "a1": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "First tunable coefficient for the breaker index (SWAN default: 7.59)",
               "title": "A1"
            },
            "a2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Second tunable coefficient for the breaker index (SWAN default: -8.06)",
               "title": "A2"
            },
            "a3": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Third tunable coefficient for the breaker index (SWAN default: 8.09)",
               "title": "A3"
            }
         },
         "title": "BREAKING_BKD",
         "type": "object"
      },
      "BREAKING_CONSTANT": {
         "additionalProperties": false,
         "description": "Constant wave breaking index.\n\n.. code-block:: text\n\n    BREAKING CONSTANT [alpha] [gamma]\n\nIndicates that a constant breaker index is to be used.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import BREAKING_CONSTANT\n    breaking = BREAKING_CONSTANT()\n    print(breaking.render())\n    breaking = BREAKING_CONSTANT(alpha=1.0, gamma=0.73)\n    print(breaking.render())",
         "properties": {
            "model_type": {
               "default": "constant",
               "description": "Model type discriminator",
               "enum": [
                  "constant",
                  "CONSTANT"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "alpha": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient of the rate of dissipation (SWAN default: 1.0)",
               "title": "Alpha"
            },
            "gamma": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The breaker index, i.e. the ratio of maximum individual wave height over depth (SWAN default: 0.73)",
               "title": "Gamma"
            }
         },
         "title": "BREAKING_CONSTANT",
         "type": "object"
      },
      "DANGREMOND": {
         "additionalProperties": false,
         "description": "DAM transmission of d'Angremond et al. (1996).\n\n.. code-block:: text\n\n    DAM DANGREMOND [hgt] [slope] [Bk]\n\nThis option specifies transmission coefficients dependent on the incident wave\nconditions at the obstacle and on the obstacle height (which may be submerged).\n\nReferences\n----------\nd'Angremond, K., Van Der Meer, J.W. and De Jong, R.J., 1996. Wave transmission at\nlow-crested structures. In Coastal Engineering 1996 (pp. 2418-2427).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import DANGREMOND\n    transm = DANGREMOND(hgt=3.0, slope=60, Bk=10.0)\n    print(transm.render())",
         "properties": {
            "model_type": {
               "default": "dangremond",
               "description": "Model type discriminator",
               "enum": [
                  "dangremond",
                  "DANGREMOND"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "hgt": {
               "description": "The elevation of the top of the obstacle above reference level (same reference level as for bottom etc.); use a negative value if the top is below that reference level",
               "title": "Hgt",
               "type": "number"
            },
            "slope": {
               "description": "The slope of the obstacle (in degrees)",
               "maximum": 90.0,
               "minimum": 0.0,
               "title": "Slope",
               "type": "number"
            },
            "Bk": {
               "description": "The crest width of the obstacle",
               "title": "Bk",
               "type": "number"
            }
         },
         "required": [
            "hgt",
            "slope",
            "Bk"
         ],
         "title": "DANGREMOND",
         "type": "object"
      },
      "DEWIT": {
         "additionalProperties": false,
         "description": "Biphase of De Wit (2022).\n\n.. code-block:: text\n\n    BIPHASE DEWIT [lpar]\n\nBiphase parameterization based on bed slope and peak period of De Wit (2022).\n\nReferences\n----------\nDe Wit, F.P., 2022. Wave shape prediction in complex coastal systems (Doctoral\ndissertation, PhD. thesis. Delft University of Technology. https://repository.\ntudelft. nl/islandora/object/uuid% 3A0fb850a4-4294-4181-9d74-857de21265c2).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import DEWIT\n    biphase = DEWIT()\n    print(biphase.render())\n    biphase = DEWIT(lpar=0.0)\n    print(biphase.render())",
         "properties": {
            "model_type": {
               "const": "dewit",
               "default": "dewit",
               "description": "Model type discriminator",
               "title": "Model Type",
               "type": "string"
            },
            "lpar": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Scales spatial averaging of the De Wit's biphase in terms of a multiple of peak wave length of the incident wave field. Note: `lpar` = 0` means no averaging (SWAN default: 0)",
               "title": "Lpar"
            }
         },
         "title": "DEWIT",
         "type": "object"
      },
      "DIFFRACTION": {
         "additionalProperties": false,
         "description": "Wave diffraction.\n\n.. code-block:: text\n\n    DIFFRACTION [idiffr] [smpar] [smnum] [cgmod]\n\nIf this optional command is given, the diffraction is included in the wave\ncomputation. But the diffraction approximation in SWAN does not properly handle\ndiffraction in harbours or in front of reflecting obstacles (see\nScientific/Technical documentation). Behind breakwaters with a down-wave beach, the\nSWAN results seem reasonable. The spatial resolution near (the tip of) the\ndiffraction obstacle should be 1/5 to 1/10 of the dominant wave length.\n\nNotes\n-----\nWithout extra measures, the diffraction computations with SWAN often converge\npoorly or not at all. Two measures can be taken:\n\n1. (RECOMMENDED) The user can request under-relaxation. See command `NUMERIC`\nparameter `alpha` and Scientific/Technical documentation (Eq. (3.31)). Very limited\nexperience suggests `alpha = 0.01`.\n\n2. Alternatively, the user can request smoothing of the wave field for the\ncomputation of the diffraction parameter (the wave field remains intact for all\nother computations and output). This is done with a repeated convolution filtering.\n\nExamples\n--------\n\n.. ipython:: python\n\n    from rompy.swan.components.physics import DIFFRACTION\n    diffraction = DIFFRACTION()\n    print(diffraction.render())\n    diffraction = DIFFRACTION(idiffr=True, smpar=0.0, smnum=1.0)\n    print(diffraction.render())",
         "properties": {
            "model_type": {
               "default": "diffraction",
               "description": "Model type discriminator",
               "enum": [
                  "diffraction",
                  "DIFFRACTION"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "idiffr": {
               "anyOf": [
                  {
                     "type": "boolean"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Indicates the use of diffraction. If `idiffr=0` then no diffraction is taken into account (SWAN default: 1)",
               "title": "Idiffr"
            },
            "smpar": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Smoothing parameter for the calculation of \u2207 \u00b7 \u221aEtot. During every smoothing step all grid points exchange `smpar` times the energy with their neighbours. Note that `smpar` is parameter a in the above text (SWAN default: 0.0)",
               "title": "Smpar"
            },
            "smnum": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Number of smoothing steps relative to `smpar` (SWAN default: 0)",
               "title": "Smnum"
            },
            "cgmod": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Adaption of propagation velocities in geographic space due to diffraction. If `cgmod=0` then no adaption (SWAN default: 1.0)",
               "title": "Cgmod"
            }
         },
         "title": "DIFFRACTION",
         "type": "object"
      },
      "ELDEBERKY": {
         "additionalProperties": false,
         "description": "Biphase of Eldeberky (1999).\n\n.. code-block:: text\n\n    BIPHASE ELDEBERKY [urcrit]\n\nBiphase parameterisation as a funtion of the Ursell number of Eldeberky (1999).\n\nReferences\n----------\nEldeberky, Y., Polnikov, V. and Battjes, J.A., 1996. A statistical approach for\nmodeling triad interactions in dispersive waves. In Coastal Engineering 1996\n(pp. 1088-1101).\n\nEldeberky, Y. and Madsen, P.A., 1999. Deterministic and stochastic evolution\nequations for fully dispersive and weakly nonlinear waves. Coastal Engineering,\n38(1), pp.1-24.\n\nDoering, J.C. and Bowen, A.J., 1995. Parametrization of orbital velocity\nasymmetries of shoaling and breaking waves using bispectral analysis. Coastal\nengineering, 26(1-2), pp.15-33.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ELDEBERKY\n    biphase = ELDEBERKY()\n    print(biphase.render())\n    biphase = ELDEBERKY(urcrit=0.63)\n    print(biphase.render())",
         "properties": {
            "model_type": {
               "const": "eldeberky",
               "default": "eldeberky",
               "description": "Model type discriminator",
               "title": "Model Type",
               "type": "string"
            },
            "urcrit": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The critical Ursell number appearing in the parametrization. Note: the value of `urcrit` is setted by Eldeberky (1996) at 0.2 based on a laboratory experiment, whereas Doering and Bowen (1995) employed the value of 0.63 based on the field experiment data (SWAN default: 0.63)",
               "title": "Urcrit"
            }
         },
         "title": "ELDEBERKY",
         "type": "object"
      },
      "FREEBOARD": {
         "additionalProperties": false,
         "description": "Freeboard dependent transmission and reflection.\n\n.. code-block:: text\n\n    FREEBOARD [hgt] [gammat] [gammar] [QUAY]\n\nWith this option the user indicates that the fixed transmission `trcoef` and\nreflection `reflc` coefficients are freeboard dependent. The freeboard dependency\nhas no effect on the transmission coefficient as computed using the DAM option.\n\nNotes\n-----\nSee the Scientific/Technical documentation for background information on the\n`gammat` and `gammar` shape parameters.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import FREEBOARD\n    freeboard = FREEBOARD(hgt=2.0)\n    print(freeboard.render())\n    freeboard = FREEBOARD(hgt=2.0, gammat=1.0, gammar=1.0, quay=True)\n    print(freeboard.render())",
         "properties": {
            "model_type": {
               "default": "freeboard",
               "description": "Model type discriminator",
               "enum": [
                  "freeboard",
                  "FREEBOARD"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "hgt": {
               "description": "The elevation of the top of the obstacle or height of the quay above the reference level (same reference level as for the bottom). Use a negative value if the top is below that reference level. In case `hgt` is also specified in the DAM option, both values of `hgt` should be equal for consistency",
               "title": "Hgt",
               "type": "number"
            },
            "gammat": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Shape parameter of relative freeboard dependency of transmission coefficient. This parameter should be higher than zero (SWAN default 1.0)",
               "title": "Gammat"
            },
            "gammar": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Shape parameter of relative freeboard dependency of reflection coefficient. This parameter should be higher than zero (SWAN default 1.0)",
               "title": "Gammar"
            },
            "quay": {
               "default": false,
               "description": "With this option the user indicates that the freeboard dependency of the transmission and reflection coefficients also depends on the relative position of an obstacle-linked grid point with respect to the position of the obstacle line representing the edge of a quay. In case the active grid point is on the deeper side of the obstacle, then the correction factors are applied using the parameters `hgt`, `gammat` and `gammar`.In case the active grid point is on the shallower side of the obstacle, the reflection coefficient is set to 0 and the transmission coefficient to 1.",
               "title": "Quay",
               "type": "boolean"
            }
         },
         "required": [
            "hgt"
         ],
         "title": "FREEBOARD",
         "type": "object"
      },
      "FRICTION_COLLINS": {
         "additionalProperties": false,
         "description": "Collins (1972) friction.\n\n.. code-block:: text\n\n    FRICTION COLLINS [cfw]\n\nNote that `cfw` is allowed to vary over the computational region; in that case use\nthe commands INPGRID FRICTION and READINP FRICTION to define and read the friction\ndata. This command FRICTION is still required to define the type of friction\nexpression. The value of `cfw` in this command is then not required (it will be\nignored).\n\nReferences\n----------\nCollins, J.I., 1972. Prediction of shallow-water spectra. Journal of Geophysical\nResearch, 77(15), pp.2693-2707.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import FRICTION_COLLINS\n    friction = FRICTION_COLLINS()\n    print(friction.render())\n    friction = FRICTION_COLLINS(cfw=0.038)\n    print(friction.render())",
         "properties": {
            "model_type": {
               "default": "collins",
               "description": "Model type discriminator",
               "enum": [
                  "collins",
                  "COLLINS"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cfw": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Collins bottom friction coefficient (SWAN default: 0.015)",
               "title": "Cfw"
            }
         },
         "title": "FRICTION_COLLINS",
         "type": "object"
      },
      "FRICTION_JONSWAP": {
         "additionalProperties": false,
         "description": "Hasselmann et al. (1973) Jonswap friction.\n\n.. code-block:: text\n\n    FRICTION JONSWAP CONSTANT [cfjon]\n\nIndicates that the semi-empirical expression derived from the JONSWAP results for\nbottom friction dissipation (Hasselmann et al., 1973, JONSWAP) should be activated.\nThis option is default.\n\nReferences\n----------\nHasselmann, K., Barnett, T.P., Bouws, E., Carlson, H., Cartwright, D.E., Enke, K.,\nEwing, J.A., Gienapp, A., Hasselmann, D.E., Kruseman, P. and Meerburg, A., 1973.\nMeasurements of wind-wave growth and swell decay during the Joint North Sea Wave\nProject (JONSWAP). Deutches Hydrographisches Institut, Hamburg, Germany,\nRep. No. 12, 95 pp.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import FRICTION_JONSWAP\n    friction = FRICTION_JONSWAP()\n    print(friction.render())\n    friction = FRICTION_JONSWAP(cfjon=0.038)\n    print(friction.render())\n\nTODO: Implement VARIABLE option?",
         "properties": {
            "model_type": {
               "default": "jonswap",
               "description": "Model type discriminator",
               "enum": [
                  "jonswap",
                  "JONSWAP"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cfjon": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient of the JONSWAP formulation (SWAN default: 0.038)",
               "title": "Cfjon"
            }
         },
         "title": "FRICTION_JONSWAP",
         "type": "object"
      },
      "FRICTION_MADSEN": {
         "additionalProperties": false,
         "description": "Madsen et al (1988) friction.\n\n.. code-block:: text\n\n    FRICTION MADSEN [kn]\n\nNote that `kn` is allowed to vary over the computational region; in that case use\nthe commands INPGRID FRICTION and READINP FRICTION to define and read the friction\ndata. This command FRICTION is still required to define the type of friction\nexpression. The value of `kn` in this command is then not required (it will be\nignored).\n\nReferences\n----------\nMadsen, O.S., Poon, Y.K. and Graber, H.C., 1988. Spectral wave attenuation by\nbottom friction: Theory. In Coastal engineering 1988 (pp. 492-504).\n\nMadsen, O.S. and Rosengaus, M.M., 1988. Spectral wave attenuation by bottom\nfriction: Experiments. In Coastal Engineering 1988 (pp. 849-857).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import FRICTION_MADSEN\n    friction = FRICTION_MADSEN()\n    print(friction.render())\n    friction = FRICTION_MADSEN(kn=0.038)\n    print(friction.render())",
         "properties": {
            "model_type": {
               "default": "madsen",
               "description": "Model type discriminator",
               "enum": [
                  "madsen",
                  "MADSEN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "kn": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "equivalent roughness length scale of the bottom (in m) (SWAN default: 0.05)",
               "title": "Kn"
            }
         },
         "title": "FRICTION_MADSEN",
         "type": "object"
      },
      "FRICTION_RIPPLES": {
         "additionalProperties": false,
         "description": "Smith et al. (2011) Ripples friction.\n\n.. code-block:: text\n\n    FRICTION RIPPLES [S] [D]\n\nIndicates that the expression of Smith et al. (2011) should be activated. Here\nfriction depends on the formation of bottom ripples and sediment size.\n\nReferences\n----------\nSmith, G.A., Babanin, A.V., Riedel, P., Young, I.R., Oliver, S. and Hubbert, G.,\n2011. Introduction of a new friction routine into the SWAN model that evaluates\nroughness due to bedform and sediment size changes. Coastal Engineering, 58(4),\npp.317-326.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import FRICTION_RIPPLES\n    friction = FRICTION_RIPPLES()\n    print(friction.render())\n    friction = FRICTION_RIPPLES(s=2.65, d=0.0001)\n    print(friction.render())",
         "properties": {
            "model_type": {
               "default": "ripples",
               "description": "Model type discriminator",
               "enum": [
                  "ripples",
                  "RIPPLES"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "s": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The specific gravity of the sediment (SWAN default: 2.65)",
               "title": "S"
            },
            "d": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The sediment diameter (in m) (SWAN default: 0.0001)",
               "title": "D"
            }
         },
         "title": "FRICTION_RIPPLES",
         "type": "object"
      },
      "GEN1": {
         "additionalProperties": false,
         "description": "First generation source terms GEN1.\n\n.. code-block:: text\n\n    GEN1 [cf10] [cf20] [cf30] [cf40] [edmlpm] [cdrag] [umin] [cfpm]\n\nWith this command the user indicates that SWAN should run in first-generation mode\n(see Scientific/Technical documentation).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import GEN1\n    gen = GEN1()\n    print(gen.render())\n    kwargs = dict(\n        cf10=188.0,\n        cf20=0.59,\n        cf30=0.12,\n        cf40=250.0,\n        edmlpm=0.0036,\n        cdrag=0.0012,\n        umin=1.0,\n        cfpm=0.13\n    )\n    gen = GEN1(**kwargs)\n    print(gen.render())",
         "properties": {
            "model_type": {
               "default": "gen1",
               "description": "Model type discriminator",
               "enum": [
                  "gen1",
                  "GEN1"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cf10": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the linear wave growth (SWAN default: 188.0)",
               "title": "Cf10"
            },
            "cf20": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the exponential wave growth (SWAN default: 0.59)",
               "title": "Cf20"
            },
            "cf30": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the exponential wave growth (SWAN default: 0.12)",
               "title": "Cf30"
            },
            "cf40": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the dissipation rate, i.e., the time decay scale (SWAN default: 250.0)",
               "title": "Cf40"
            },
            "edmlpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Maximum non-dimensionless energy density of the wind sea part of the spectrum according to Pierson Moskowitz (SWAN default: 0.0036)",
               "title": "Edmlpm"
            },
            "cdrag": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Drag coefficient (SWAN default: 0.0012)",
               "title": "Cdrag"
            },
            "umin": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Minimum wind velocity (relative to current; all wind speeds are taken at 10 m above sea level) (SWAN default: 1)",
               "title": "Umin"
            },
            "cfpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient which determines the Pierson Moskowitz frequency: `delta_PM = 2pi g / U_10` (SWAN default: 0.13)",
               "title": "Cfpm"
            }
         },
         "title": "GEN1",
         "type": "object"
      },
      "GEN2": {
         "additionalProperties": false,
         "description": "Second generation source terms GEN2.\n\n.. code-block:: text\n\n    GEN2 [cf10] [cf20] [cf30] [cf40] [cf50] [cf60] [edmlpm] [cdrag] [umin] [cfpm]\n\nWith this command the user indicates that SWAN should run in second-generation mode\n(see Scientific/Technical documentation).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import GEN2\n    gen = GEN2()\n    print(gen.render())\n    kwargs = dict(\n        cf10=188.0,\n        cf20=0.59,\n        cf30=0.12,\n        cf40=250.0,\n        cf50=0.0023,\n        cf60=-0.223,\n        edmlpm=0.0036,\n        cdrag=0.0012,\n        umin=1.0,\n        cfpm=0.13\n    )\n    gen = GEN2(**kwargs)\n    print(gen.render())",
         "properties": {
            "model_type": {
               "default": "gen2",
               "description": "Model type discriminator",
               "enum": [
                  "gen2",
                  "GEN2"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cf10": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the linear wave growth (SWAN default: 188.0)",
               "title": "Cf10"
            },
            "cf20": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the exponential wave growth (SWAN default: 0.59)",
               "title": "Cf20"
            },
            "cf30": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the exponential wave growth (SWAN default: 0.12)",
               "title": "Cf30"
            },
            "cf40": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the dissipation rate, i.e., the time decay scale (SWAN default: 250.0)",
               "title": "Cf40"
            },
            "edmlpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Maximum non-dimensionless energy density of the wind sea part of the spectrum according to Pierson Moskowitz (SWAN default: 0.0036)",
               "title": "Edmlpm"
            },
            "cdrag": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Drag coefficient (SWAN default: 0.0012)",
               "title": "Cdrag"
            },
            "umin": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Minimum wind velocity (relative to current; all wind speeds are taken at 10 m above sea level) (SWAN default: 1)",
               "title": "Umin"
            },
            "cfpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient which determines the Pierson Moskowitz frequency: `delta_PM = 2pi g / U_10` (SWAN default: 0.13)",
               "title": "Cfpm"
            },
            "cf50": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the spectral energy scale of the limit spectrum (SWAN default: 0.0023)",
               "title": "Cf50"
            },
            "cf60": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ccontrols the spectral energy scale of the limit spectrum (SWAN default: -0.223",
               "title": "Cf60"
            }
         },
         "title": "GEN2",
         "type": "object"
      },
      "GEN3": {
         "additionalProperties": false,
         "description": "Third generation source terms GEN3.\n\n.. code-block:: text\n\n    GEN3 JANSSEN|KOMEN|->WESTHUYSEN|ST6 AGROW [a]\n\nWith this command the user indicates that SWAN should run in third-generation mode\nfor wind input, quadruplet interactions and whitecapping.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import GEN3\n    gen = GEN3(\n        source_terms=dict(\n            model_type=\"westhuysen\",\n            wind_drag=\"wu\",\n            agrow=True,\n        ),\n    )\n    print(gen.render())\n    from rompy.swan.subcomponents.physics import ST6C1\n    gen = GEN3(source_terms=ST6C1())\n    print(gen.render())",
         "properties": {
            "model_type": {
               "default": "gen3",
               "description": "Model type discriminator",
               "enum": [
                  "gen3",
                  "GEN3"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "source_terms": {
               "description": "SWAN source terms to be used (SWAN default: WESTHUYSEN)",
               "discriminator": {
                  "mapping": {
                     "JANSSEN": "#/$defs/JANSSEN",
                     "KOMEN": "#/$defs/KOMEN",
                     "WESTHUYSEN": "#/$defs/WESTHUYSEN",
                     "janssen": "#/$defs/JANSSEN",
                     "komen": "#/$defs/KOMEN",
                     "st6": "#/$defs/ST6",
                     "st6c1": "#/$defs/ST6C1",
                     "st6c2": "#/$defs/ST6C2",
                     "st6c3": "#/$defs/ST6C3",
                     "st6c4": "#/$defs/ST6C4",
                     "st6c5": "#/$defs/ST6C5",
                     "westhuysen": "#/$defs/WESTHUYSEN"
                  },
                  "propertyName": "model_type"
               },
               "oneOf": [
                  {
                     "$ref": "#/$defs/JANSSEN"
                  },
                  {
                     "$ref": "#/$defs/KOMEN"
                  },
                  {
                     "$ref": "#/$defs/WESTHUYSEN"
                  },
                  {
                     "$ref": "#/$defs/ST6"
                  },
                  {
                     "$ref": "#/$defs/ST6C1"
                  },
                  {
                     "$ref": "#/$defs/ST6C2"
                  },
                  {
                     "$ref": "#/$defs/ST6C3"
                  },
                  {
                     "$ref": "#/$defs/ST6C4"
                  },
                  {
                     "$ref": "#/$defs/ST6C5"
                  }
               ],
               "title": "Source Terms"
            }
         },
         "title": "GEN3",
         "type": "object"
      },
      "GODA": {
         "additionalProperties": false,
         "description": "DAM transmission of Goda/Seelig (1979).\n\n.. code-block:: text\n\n    DAM GODA [hgt] [alpha] [beta]\n\nThis option specified transmission coefficients dependent on the incident wave\nconditions at the obstacle and on the obstacle height (which may be submerged).\n\nReferences\n----------\nGoda, Y. and Suzuki, Y., 1976. Estimation of incident and reflected waves in random\nwave experiments. In Coastal Engineering 1976 (pp. 828-845).\n\nSeelig, W.N., 1979. Effects of breakwaters on waves: Laboratory test of wave\ntransmission by overtopping. In Proc. Conf. Coastal Structures, 1979\n(Vol. 79, No. 2, pp. 941-961).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import GODA\n    transm = GODA(hgt=3.0)\n    print(transm.render())\n    transm = GODA(hgt=3.0, alpha=2.6, beta=0.15)\n    print(transm.render())",
         "properties": {
            "model_type": {
               "default": "goda",
               "description": "Model type discriminator",
               "enum": [
                  "goda",
                  "GODA"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "hgt": {
               "description": "The elevation of the top of the obstacle above reference level (same reference level as for bottom etc.); use a negative value if the top is below that reference level",
               "title": "Hgt",
               "type": "number"
            },
            "alpha": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "coefficient determining the transmission coefficient for Goda's transmission formula (SWAN default: 2.6)",
               "title": "Alpha"
            },
            "beta": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Another coefficient determining the transmission coefficient for Goda's transmission formula (SWAN default: 0.15)",
               "title": "Beta"
            }
         },
         "required": [
            "hgt"
         ],
         "title": "GODA",
         "type": "object"
      },
      "IDLA": {
         "description": "Order of values in the input files.\n\nAttributes\n----------\nONE: 1\n    SWAN reads the map from left to right starting in the upper-left-hand corner of\n    the map. A new line in the map should start on a new line in the file.\nTWO: 2\n    As `1` but a new line in the map need not start on a new line in the file.\nTHREE: 3\n    SWAN reads the map from left to right starting in the lower-left-hand corner of\n    the map. A new line in the map should start on a new line in the file.\nFOUR: 4\n    As `3` but a new line in the map need not start on a new line in the file.\nFIVE: 5\n    SWAN reads the map from top to bottom starting in the lower-left-hand corner of\n    the map. A new column in the map should start on a new line in the file.\nSIX: 6\n    As `5` but a new column in the map need not start on a new line in the file.\n\nNotes\n-----\nIt is assumed that the x-axis of the grid is pointing to the right and the y-axis\nupwards.",
         "enum": [
            1,
            2,
            3,
            4,
            5,
            6
         ],
         "title": "IDLA",
         "type": "integer"
      },
      "JANSSEN": {
         "additionalProperties": false,
         "description": "Janssen source terms subcomponent.\n\n.. code-block:: text\n\n    JANSSEN [cds1] [delta] (AGROW [a])\n\nReferences\n----------\nJanssen, P.A., 1989. Wave-induced stress and the drag of air flow over sea waves.\nJournal of Physical Oceanography, 19(6), pp.745-754.\n\nJanssen, P.A.E.M., Lionello, P. and Zambresky, L., 1989. On the interaction of wind\nand waves. Philosophical transactions of the royal society of London. Series A,\nMathematical and Physical Sciences, 329(1604), pp.289-301.\n\nJanssen, P.A., 1991. Quasi-linear theory of wind-wave generation applied to wave\nforecasting. Journal of physical oceanography, 21(11), pp.1631-1642.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import JANSSEN\n    janssen = JANSSEN()\n    print(janssen.render())\n    janssen = JANSSEN(cds1=4.5, delta=0.5, agrow=True)\n    print(janssen.render())",
         "properties": {
            "model_type": {
               "default": "janssen",
               "description": "Model type discriminator",
               "enum": [
                  "janssen",
                  "JANSSEN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "wu",
               "description": "Indicates the wind drag formulation",
               "enum": [
                  "wu",
                  "fit"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "default": false,
               "description": "Activate the Cavaleri and Malanotte (1981) wave growth term",
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "cds1": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for determining the rate of whitecapping dissipation ($Cds / s^4_{PM}$) (SWAN default: 4.5)",
               "title": "Cds1"
            },
            "delta": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient which determines the dependency of the whitecapping on wave number (mix with Komen et al. formulation) (SWAN default: 0.5)",
               "title": "Delta"
            }
         },
         "title": "JANSSEN",
         "type": "object"
      },
      "KOMEN": {
         "additionalProperties": false,
         "description": "Komen source terms subcomponent.\n\n.. code-block:: text\n\n    KOMEN [cds2] [stpm] (AGROW [a])\n\nReferences\n----------\nKomen, G.J., Hasselmann, S. and Hasselmann, K., 1984. On the existence of a fully\ndeveloped wind-sea spectrum. Journal of physical oceanography, 14(8), pp.1271-1285.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import KOMEN\n    komen = KOMEN()\n    print(komen.render())\n    komen = KOMEN(cds2=2.36e-5, stpm=3.02e-3, agrow=True, a=0.0015)\n    print(komen.render())",
         "properties": {
            "model_type": {
               "default": "komen",
               "description": "Model type discriminator",
               "enum": [
                  "komen",
                  "KOMEN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "wu",
               "description": "Indicates the wind drag formulation",
               "enum": [
                  "wu",
                  "fit"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "default": false,
               "description": "Activate the Cavaleri and Malanotte (1981) wave growth term",
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "cds2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for determining the rate of whitecapping dissipation (`Cds`) (SWAN default: 2.36e-5)",
               "title": "Cds2"
            },
            "stpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Value of the wave steepness for a Pierson-Moskowitz spectrum (`s^2_PM`) (SWAN default: 3.02e-3)",
               "title": "Stpm"
            }
         },
         "title": "KOMEN",
         "type": "object"
      },
      "LIMITER": {
         "additionalProperties": false,
         "description": "Physics limiter.\n\n.. code-block:: text\n\n    LIMITER [ursell] [qb]\n\nWith this command the user can de-activate permanently the quadruplets when\nthe actual Ursell number exceeds `ursell`. Moreover, as soon as the actual\nfraction of breaking waves exceeds `qb` then the action limiter will not be\nused in case of decreasing action density.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import LIMITER\n    limiter = LIMITER()\n    print(limiter.render())\n    limiter = LIMITER(ursell=10.0, qb=1.0)\n    print(limiter.render())",
         "properties": {
            "model_type": {
               "default": "limiter",
               "description": "Model type discriminator",
               "enum": [
                  "limiter",
                  "LIMITER"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "ursell": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The upper threshold for Ursell number (SWAN default: 10.0)",
               "title": "Ursell"
            },
            "qb": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The threshold for fraction of breaking waves (SWAN default: 1.0)",
               "title": "Qb"
            }
         },
         "title": "LIMITER",
         "type": "object"
      },
      "LINE": {
         "additionalProperties": false,
         "description": "Line of points to define obstacle location.\n\n.. code-block:: text\n\n    LINE < [xp] [yp] >\n\nWith this option the user indicates that the fixed transmission `trcoef` and\nreflection `reflc` coefficients are freeboard dependent. The freeboard dependency\nhas no effect on the transmission coefficient as computed using the DAM option.\n\nNotes\n-----\nPoints coordinates should be provided in m If Cartesian coordinates are used or in\ndegrees if spherical coordinates are used (see command `COORD`). At least two\ncorner points must be provided.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import LINE\n    line = LINE(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1])\n    print(line.render())",
         "properties": {
            "model_type": {
               "default": "line",
               "description": "Model type discriminator",
               "enum": [
                  "line",
                  "LINE"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "xp": {
               "description": "The x-coordinates of the points defining the line",
               "items": {
                  "type": "number"
               },
               "minItems": 2,
               "title": "Xp",
               "type": "array"
            },
            "yp": {
               "description": "The y-coordinates of the points defining the line",
               "items": {
                  "type": "number"
               },
               "minItems": 2,
               "title": "Yp",
               "type": "array"
            }
         },
         "required": [
            "xp",
            "yp"
         ],
         "title": "LINE",
         "type": "object"
      },
      "MUD": {
         "additionalProperties": false,
         "description": "Mud dumping.\n\n.. code-block:: text\n\n    MUD [layer] [rhom] [viscm]\n\nWith this command the user can activate wave damping due to mud based on Ng (2000).\nIf this command or the commands INPGRID MUDLAY and READINP MUDLAY are not used,\nSWAN will not account for muddy bottom effects.\n\nReferences\n----------\nNg, C., 2000, Water waves over a muddy bed: A two layer Stokes' boundary layer\nmodel, Coastal Eng., 40, 221-242.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import MUD\n    mud = MUD()\n    print(mud.render())\n    mud = MUD(\n        layer=2.0,\n        rhom=1300,\n        viscm=0.0076,\n    )\n    print(mud.render())\n\nTODO: Validate `layer` must be prescribed if `INPGRID MUDLAY` isn't used.",
         "properties": {
            "model_type": {
               "default": "mud",
               "description": "Model type discriminator",
               "enum": [
                  "mud",
                  "MUD"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "layer": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The thickness of the mud layer (in m). Note that `layer` is allowed to vary over the computational region to account for the zonation of muddy bottom. In that case use the commands `INPGRID MUDLAY` and `READINP MUDLAY` to define and read the layer thickness of mud. The value of `layer` in this command is then not required (it will be ignored)",
               "title": "Layer"
            },
            "rhom": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The density of the mud layer (in kg/m3) (SWAN default: 1300)",
               "title": "Rhom"
            },
            "viscm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The kinematic viscosity of the mud layer (in m2/s) (SWAN default: 0.0076)",
               "title": "Viscm"
            }
         },
         "title": "MUD",
         "type": "object"
      },
      "NEGATINP": {
         "additionalProperties": false,
         "description": "Negative wind input.\n\n.. code-block:: text\n\n    NEGATINP [rdcoef]\n\nWith this optional command the user activates negative wind input. **This is\nintended only for use with non-breaking swell dissipation SSWELL ZIEGER**.\nParameter `rdcoef` is a fraction between 0 and 1, representing the strength of\nnegative wind input. As an example, with [rdcoef]=0.04, for a spectral bin that is\nopposed to the wind direction, the wind input factor W(k, \u03b8) is negative, and its\nmagnitude is 4% of the corresponding value of the spectral bin that is in the\nopposite direction (i.e. in the wind direction). See Zieger et al. (2015) eq. 11,\nwhere a0 is their notation for [rdcoef]. Default [rdcoef]=0.0 and `rdcoef=0.04` is\nrecommended, though as implied by Zieger et al. (2015), this value is not\nwell-established, so the user is encouraged to experiment with other values.\n\nReferences\n----------\nZieger, S., Babanin, A.V., Rogers, W.E. and Young, I.R., 2015. Observation-based\nsource terms in the third-generation wave model WAVEWATCH. Ocean Modelling, 96,\npp.2-25.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import NEGATINP\n    negatinp = NEGATINP()\n    print(negatinp.render())\n    negatinp = NEGATINP(rdcoef=0.04)\n    print(negatinp.render())",
         "properties": {
            "model_type": {
               "default": "negatinp",
               "description": "Model type discriminator",
               "enum": [
                  "negatinp",
                  "NEGATINP"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "rdcoef": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient representing the strength of negative wind input",
               "title": "Rdcoef"
            }
         },
         "title": "NEGATINP",
         "type": "object"
      },
      "OBSTACLE": {
         "additionalProperties": false,
         "description": "Subgrid obstacle.\n\n.. code-block:: text\n\n    OBSTACLE ->TRANSM|TRANS1D|TRANS2D|GODA|DANGREMOND REFL [reflc] ->RSPEC|RDIFF &\n        (FREEBOARD [hgt] [gammat] [gammar] QUAY) LINE < [xp] [yp] >\n\nWith this optional command the user provides the characteristics of a (line\nof) sub-grid obstacle(s) through which waves are transmitted or against which\nwaves are reflected (possibly both at the same time). The obstacle is sub-grid\nin the sense that it is narrow compared to the spatial meshes; its length should\nbe at least one mesh length.\n\nThe location of the obstacle is defined by a sequence of corner points of a line.\nThe obstacles interrupt the propagation of the waves from one grid point to the\nnext wherever this obstacle line is located between two neighbouring grid points\n(of the computational grid; the resolution of the obstacle is therefore equal to\nthe computational grid spacing). This implies that an obstacle to be effective must\nbe located such that it crosses at least one grid line. This is always the case\nwhen an obstacle is larger than one mesh length.\n\nNotes\n-----\n\n* The advise is to define obstacles with the least amount of points possible.\n* SWAN checks if the criterion `reflc^2 + trcoef^2 LE 1` is fulfilled.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import OBSTACLE\n    obs = OBSTACLE(\n        transmission=dict(model_type=\"transm\", trcoef=0.5),\n        reflection=dict(reflc=0.5),\n        line=dict(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1]),\n    )\n    print(obs.render())",
         "properties": {
            "model_type": {
               "default": "obstacle",
               "description": "Model type discriminator",
               "enum": [
                  "obstacle",
                  "OBSTACLE"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "transmission": {
               "anyOf": [
                  {
                     "description": "Wave transmission",
                     "discriminator": {
                        "mapping": {
                           "DANGREMOND": "#/$defs/DANGREMOND",
                           "GODA": "#/$defs/GODA",
                           "TRANS1D": "#/$defs/TRANS1D",
                           "TRANS2D": "#/$defs/TRANS2D",
                           "TRANSM": "#/$defs/TRANSM",
                           "dangremond": "#/$defs/DANGREMOND",
                           "goda": "#/$defs/GODA",
                           "trans1d": "#/$defs/TRANS1D",
                           "trans2d": "#/$defs/TRANS2D",
                           "transm": "#/$defs/TRANSM"
                        },
                        "propertyName": "model_type"
                     },
                     "oneOf": [
                        {
                           "$ref": "#/$defs/TRANSM"
                        },
                        {
                           "$ref": "#/$defs/TRANS1D"
                        },
                        {
                           "$ref": "#/$defs/TRANS2D"
                        },
                        {
                           "$ref": "#/$defs/GODA"
                        },
                        {
                           "$ref": "#/$defs/DANGREMOND"
                        }
                     ]
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Transmission"
            },
            "reflection": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/REFL"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Wave reflection"
            },
            "reflection_type": {
               "anyOf": [
                  {
                     "description": "Wave reflection type",
                     "discriminator": {
                        "mapping": {
                           "RDIFF": "#/$defs/RDIFF",
                           "RSPEC": "#/$defs/RSPEC",
                           "rdiff": "#/$defs/RDIFF",
                           "rspec": "#/$defs/RSPEC"
                        },
                        "propertyName": "model_type"
                     },
                     "oneOf": [
                        {
                           "$ref": "#/$defs/RSPEC"
                        },
                        {
                           "$ref": "#/$defs/RDIFF"
                        }
                     ]
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Reflection Type"
            },
            "freeboard": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/FREEBOARD"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Freeboard"
            },
            "line": {
               "$ref": "#/$defs/LINE",
               "default": null,
               "description": "Line of obstacle"
            }
         },
         "title": "OBSTACLE",
         "type": "object"
      },
      "OBSTACLES": {
         "additionalProperties": false,
         "description": "List of swan obstacles.\n\n.. code-block:: text\n\n    OBSTACLE ... LINE < [xp] [yp] >\n    OBSTACLE ... LINE < [xp] [yp] >\n    .\n\nThis group component is a convenience to allow defining and rendering\na list of obstacle components.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import OBSTACLES, OBSTACLE, OBSTACLE_FIG\n    obst1 = dict(\n        model_type=\"obstacle\",\n        reflection=dict(reflc=1.0),\n        line=dict(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1]),\n    )\n    obst2 = OBSTACLE(\n        transmission=dict(model_type=\"transm\"),\n        line=dict(xp=[174.3, 174.3], yp=[-39.1, -39.2]),\n    )\n    obst3 = OBSTACLE_FIG(\n        alpha1=5e-4,\n        hss=2.5,\n        tss=10.3,\n        line=dict(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1]),\n    )\n    obstacles = OBSTACLES(obstacles=[obst1, obst2, obst3])\n    for obst in obstacles.render():\n        print(obst)",
         "properties": {
            "model_type": {
               "default": "obstacles",
               "description": "Model type discriminator",
               "enum": [
                  "obstacles",
                  "OBSTACLES"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "obstacles": {
               "description": "List of obstacles",
               "items": {
                  "discriminator": {
                     "mapping": {
                        "FIG": "#/$defs/OBSTACLE_FIG",
                        "OBSTACLE": "#/$defs/OBSTACLE",
                        "fig": "#/$defs/OBSTACLE_FIG",
                        "obstacle": "#/$defs/OBSTACLE"
                     },
                     "propertyName": "model_type"
                  },
                  "oneOf": [
                     {
                        "$ref": "#/$defs/OBSTACLE"
                     },
                     {
                        "$ref": "#/$defs/OBSTACLE_FIG"
                     }
                  ]
               },
               "title": "Obstacles",
               "type": "array"
            }
         },
         "required": [
            "obstacles"
         ],
         "title": "OBSTACLES",
         "type": "object"
      },
      "OBSTACLE_FIG": {
         "additionalProperties": false,
         "description": "Obstacle for free infragravity radiation.\n\n.. code-block:: text\n\n    OBSTACLE FIG [alpha1] [hss] [tss] (REFL [reflc]) LINE <[xp] [yp]>\n\nWith this optional command the user specifies the obstacles along which the\nfree infra-gravity (FIG) energy is radiated. By placing the obstacles close to\nthe shorelines SWAN will include the FIG source term along the coastlines\naccording to the parametrization of Ardhuin et al. (2014).\n\nThe location of the obstacle is defined by a sequence of corner points of a line.\nFor an obstacle line to be effective its length is at least one mesh size large. It\nis recommended to place the obstacles at the inner area of the computational grid,\nnot at or through the boundaries. In particular, each obstacle line must be\nbordered by wet points on both sides.\n\nIn addition, the orientation of the obstacle line determines from which side of the\nobstacle the FIG wave energy is radiated away. If the begin point of the line is\nbelow or left of the end point, that is, pointing upwards/to the right, then FIG\nenergy is radiated from the west/north side of the line. If the begin point is\nabove or right of the end point (pointing downwards/to the left), then FIG energy\nis radiated away from the east/south side of the obstacle line.\n\nReferences\n----------\nArdhuin, F., Rawat, A. and Aucan, J., 2014. A numerical model for free\ninfragravity waves: Definition and validation at regional and global scales.\nOcean Modelling, 77, pp.20-32.\n\nNotes\n-----\nEither `hss` or `tss` or both are allowed to vary over the computational domain.\nIn that case use the commands `INPGRID HSS` and `READINP HSS` and/or the commands\n`INPGRID TSS` and `READINP TSS` to define and read the sea-swell wave height/period\nIt is permissible to have constant sea-swell height and non-constant sea-swell\nperiod, or vice versa. The command `OBST FIG` is still required to define the\nobstacles. The values of `hss` and/or `tss` in this command are then not required\n(they will be ignored).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import OBSTACLE_FIG\n    obs = OBSTACLE_FIG(\n        alpha1=5e-4,\n        hss=2.5,\n        tss=10.3,\n        line=dict(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1]),\n    )\n    print(obs.render())\n    obs = OBSTACLE_FIG(\n        alpha1=5e-4,\n        hss=2.5,\n        tss=10.3,\n        reflection=dict(reflc=0.5),\n        line=dict(xp=[174.1, 174.2, 174.3], yp=[-39.1, -39.1, -39.1]),\n    )\n    print(obs.render())",
         "properties": {
            "model_type": {
               "default": "fig",
               "description": "Model type discriminator",
               "enum": [
                  "fig",
                  "FIG"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "alpha1": {
               "description": "Calibration parameter (in 1/s) for determining the rate of radiating FIG energy from the shorelines, values in Table 1 of Ardhuin et al. (2014) are between 4e-4 and 8.1e-4",
               "title": "Alpha1",
               "type": "number"
            },
            "hss": {
               "description": "The sea-swell significant wave height (in m)",
               "minimum": 0.0,
               "title": "Hss",
               "type": "number"
            },
            "tss": {
               "description": "The sea-swell mean wave period (in s)",
               "minimum": 0.0,
               "title": "Tss",
               "type": "number"
            },
            "reflection": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/REFL"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Wave reflection"
            },
            "line": {
               "$ref": "#/$defs/LINE",
               "description": "Line of obstacle"
            }
         },
         "required": [
            "alpha1",
            "hss",
            "tss",
            "line"
         ],
         "title": "OBSTACLE_FIG",
         "type": "object"
      },
      "OFF": {
         "additionalProperties": false,
         "description": "Deactivate physics commands.\n\n.. code-block:: text\n\n    OFF WINDGROWTH|QUADRUPL|WCAPPING|BREAKING|REFRAC|FSHIFT|BNDCHK\n\nThis command deactivates physics commands. The command can be used to switch off\nthe computation of a certain physics component without having to remove the command\nfrom the input file. This is useful for testing purposes.\n\nExamples:\n---------\n\n.. ipython:: python\n\n    from rompy.swan.components.physics import OFF\n    off = OFF(physics=\"windgrowth\")\n    print(off.render())",
         "properties": {
            "model_type": {
               "default": "off",
               "description": "Model type discriminator",
               "enum": [
                  "off",
                  "OFF"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "physics": {
               "$ref": "#/$defs/PhysicsOff",
               "description": "Physics command to be switched off"
            }
         },
         "required": [
            "physics"
         ],
         "title": "OFF",
         "type": "object"
      },
      "OFFS": {
         "additionalProperties": false,
         "description": "Deactivate multiple physics commands.\n\n.. code-block:: text\n\n    OFF WINDGROWTH|QUADRUPL|WCAPPING|BREAKING|REFRAC|FSHIFT|BNDCHK\n    OFF WINDGROWTH|QUADRUPL|WCAPPING|BREAKING|REFRAC|FSHIFT|BNDCHK\n    .\n\nThis group component is a convenience to allow defining and rendering\na list of `OFF` components.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import OFFS\n    off1 = dict(physics=\"windgrowth\")\n    off2 = dict(physics=\"wcapping\")\n    offs = OFFS(offs=[off1, off2])\n    for off in offs.render():\n        print(off)",
         "properties": {
            "model_type": {
               "default": "offs",
               "description": "Model type discriminator",
               "enum": [
                  "offs",
                  "OFFS"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "offs": {
               "description": "Physics commands to deactivate",
               "items": {
                  "$ref": "#/$defs/OFF"
               },
               "title": "Offs",
               "type": "array"
            }
         },
         "required": [
            "offs"
         ],
         "title": "OFFS",
         "type": "object"
      },
      "PhysicsOff": {
         "description": "Physics commands to be switched off.\n\nAttributes\n----------\nWINDGROWTH : str = \"windgrowth\"\n    Switches off wind growth (in commands GEN1, GEN2, GEN3).\nQUADRUPL : str = \"quadrupl\"\n    Switches off quadruplet wave interactions (in command GEN3).\nWCAPPING : str = \"wcapping\"\n    Switches off whitecapping (in command GEN3).\nBREAKING : str = \"breaking\"\n    Switches off wave breaking dissipation.\nREFRAC : str = \"refrac\"\n    Switches off wave refraction (action transport in theta space).\nFSHIFT : str = \"fshift\"\n    Switches off frequency shifting (action transport in sigma space).\nBNDCHK : str = \"bndchk\"\n    Switches off the checking of the delta imposed and computed Hs at the boundary.",
         "enum": [
            "windgrowth",
            "quadrupl",
            "wcapping",
            "breaking",
            "refrac",
            "fshift",
            "bndchk"
         ],
         "title": "PhysicsOff",
         "type": "string"
      },
      "QUADRUPL": {
         "additionalProperties": false,
         "description": "Nonlinear quadruplet wave interactions.\n\n.. code-block:: text\n\n    QUADRUPL [iquad] [lambda] [cnl4] [Csh1] [Csh2] [Csh3]\n\nWith this option the user can influence the computation of nonlinear quadruplet\nwave interactions which are usually included in the computations. Can be\nde-activated with command OFF QUAD. Note that the DIA approximation of the\nquadruplet interactions is a poor approximation for long-crested waves and\nfrequency resolutions that are deviating much more than 10% (see command CGRID).\nNote that DIA is usually updated per sweep, either semi-implicit (`iquad = 1`) or\nexplicit (`iquad = 2`). However, when ambient current is included, the bounds of\nthe directional sector within a sweep may be different for each frequency bin\n(particularly the higher frequencies are modified by the current). So there may be\nsome overlap of frequency bins between the sweeps, implying non-conservation of\nwave energy. To prevent this the user is advised to choose the integration of DIA\nper iteration instead of per sweep, i.e. `iquad = 3`. If you want to speed up your\ncomputation a bit more, than the choice `iquad = 8` is a good choice.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import QUADRUPL\n    quadrupl = QUADRUPL()\n    print(quadrupl.render())\n    kwargs = dict(\n        iquad=3, lambd=0.25, cnl4=3.0e7, csh1=5.5, csh2=0.833333, csh3=-1.25\n    )\n    quadrupl = QUADRUPL(**kwargs)\n    print(quadrupl.render())",
         "properties": {
            "model_type": {
               "default": "quadrupl",
               "description": "Model type discriminator",
               "enum": [
                  "quadrupl",
                  "QUADRUPL"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "iquad": {
               "anyOf": [
                  {
                     "enum": [
                        1,
                        2,
                        3,
                        8,
                        4,
                        51,
                        52,
                        53
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Numerical procedures for integrating the quadruplets: 1 = semi-implicit per sweep, 2 = explicit per sweep, 3 = explicit per iteration, 8 = explicit per iteration, but with a more efficient implementation, 4 = multiple DIA, 51 = XNL (deep water transfer), 52 = XNL (deep water transfer with WAM depth scaling), 53  XNL (finite depth transfer) (SWAN default: 2)",
               "title": "Iquad"
            },
            "lambd": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for quadruplet configuration in case of DIA (SWAN default: 0.25)",
               "title": "Lambd"
            },
            "cnl4": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient for quadruplet interactions in case of DIA (SWAN default: 3.0e7",
               "title": "Cnl4"
            },
            "csh1": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for shallow water scaling in case of DIA (SWAN default: 5.5)",
               "title": "Csh1"
            },
            "csh2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for shallow water scaling in case of DIA (SWAN default: 0.833333)",
               "title": "Csh2"
            },
            "csh3": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for shallow water scaling in case of DIA (SWAN default: -1.25)",
               "title": "Csh3"
            }
         },
         "title": "QUADRUPL",
         "type": "object"
      },
      "RDIFF": {
         "additionalProperties": false,
         "description": "Diffuse reflection.\n\n.. code-block:: text\n\n    RDIFF [pown]\n\nSpecular reflection where incident waves are scattered over reflected direction.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import RDIFF\n    refl = RDIFF()\n    print(refl.render())\n    refl = RDIFF(pown=1.0)\n    print(refl.render())",
         "properties": {
            "model_type": {
               "default": "rdiff",
               "description": "Model type discriminator",
               "enum": [
                  "rdiff",
                  "RDIFF"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "pown": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Each incoming direction \u03b8 is scattered over reflected direction \u03b8_refl according to cos^pown(\u03b8-\u03b8_refl). The parameter `pown` indicates the widthof the redistribution function (SWAN default: 1.0)",
               "title": "Pown"
            }
         },
         "title": "RDIFF",
         "type": "object"
      },
      "REFL": {
         "additionalProperties": false,
         "description": "Obstacle reflections.\n\n.. code-block:: text\n\n    REFL [reflc]\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import REFL\n    refl = REFL()\n    print(refl.render())\n    refl = REFL(reflc=0.5)\n    print(refl.render())",
         "properties": {
            "model_type": {
               "default": "refl",
               "description": "Model type discriminator",
               "enum": [
                  "refl",
                  "REFL"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "reflc": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Constant reflection coefficient (ratio of reflected over incoming significant wave height) (SWAN default: 1.0)",
               "title": "Reflc"
            }
         },
         "title": "REFL",
         "type": "object"
      },
      "RSPEC": {
         "additionalProperties": false,
         "description": "Specular reflection.\n\n.. code-block:: text\n\n    RSPEC\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import RSPEC\n    refl = RSPEC()\n    print(refl.render())",
         "properties": {
            "model_type": {
               "default": "rspec",
               "description": "Model type discriminator",
               "enum": [
                  "rspec",
                  "RSPEC"
               ],
               "title": "Model Type",
               "type": "string"
            }
         },
         "title": "RSPEC",
         "type": "object"
      },
      "SCAT": {
         "additionalProperties": false,
         "description": "Scattering.\n\n.. code-block:: text\n\n    SCAT [iqcm] (GRID [rfac]) (TRUNC [alpha] [qmax])\n\nUsing this optional command, the user activates a source term that allows for the\ngeneration and propagation of cross correlations between scattered waves due to\nvariations in the bathymetry and mean currents. Such variations are rapid compared\nto the distancebetween the crossing waves (at the scale of 100-1000 m) and is\nparticularly relevant for cases involving narrowband waves (swells) in coastal\nregions with shallow water and ambient currents. In turn, the immediate spatial\neffects of coherent scattering, interference, refraction and diffraction can cause\nlarge-scale changes in the wave parameters.\n\nReferences\n----------\nSmit, P.B. and Janssen, T.T., 2013. The evolution of inhomogeneous wave statistics\nthrough a variable medium. Journal of Physical Oceanography, 43(8), pp.1741-1758.\n\nSmit, P.B., Janssen, T.T. and Herbers, T.H.C., 2015. Stochastic modeling of\ninhomogeneous ocean waves. Ocean Modelling, 96, pp.26-35.\n\nSmit, P.B., Janssen, T.T. and Herbers, T.H.C., 2015. Stochastic modeling of\ncoherent wave fields over variable depth. Journal of Physical Oceanography, 45(4),\npp.1139-1154.\n\nAkrish, G., Smit, P., Zijlema, M. and Reniers, A., 2020. Modelling statistical wave\ninterferences over shear currents. Journal of Fluid Mechanics, 891, p.A2.\n\nNotes\n-----\nImplemented in SWAN 41.41.\n\nIf both `alpha` and `qmax` options are provided to truncate the infinite\nconvolution sum their mimimum is considered as the final limit on the sum.\n\nExamples:\n---------\n\n.. ipython:: python\n\n    from rompy.swan.components.physics import SCAT\n    scat = SCAT()\n    print(scat.render())\n    scat = SCAT(iqcm=2, rfac=1.0, alpha=1.0)\n    print(scat.render())",
         "properties": {
            "model_type": {
               "default": "scat",
               "description": "Model type discriminator",
               "enum": [
                  "scat",
                  "SCAT"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "iqcm": {
               "anyOf": [
                  {
                     "enum": [
                        0,
                        1,
                        2
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Indicates the modelling and computation of QC scattering:\n\n* 0: no scattering\n* 1: scattering due to non-uniform bathymetry and currents (the latter only if applicable; see command `INPGRID CURRENT`)\n* 2: wave-current interaction under the assumption of a slowly varying bathymetry\n\n(SWAN default: 1)",
               "title": "Iqcm"
            },
            "rfac": {
               "anyOf": [
                  {
                     "minimum": 1.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The resolution factor through which the incident spectral width ismultiplied (SWAN default: 1.0)",
               "title": "Rfac"
            },
            "alpha": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The coefficient by which the mean wave number is multiplied to set thelimit on the convolution sum (SWAN default: 1.0)",
               "title": "Alpha"
            },
            "qmax": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The maximum scattering wave number (in 1/m)",
               "title": "Qmax"
            }
         },
         "title": "SCAT",
         "type": "object"
      },
      "SETUP": {
         "additionalProperties": false,
         "description": "Wave setup.\n\n.. code-block:: text\n\n    SETUP [supcor]\n\nIf this command is given, the wave-induced set-up is computed and accounted for in\nthe wave computations (during the computation it is added to the depth that is\nobtained from the `READ BOTTOM` and `READ WLEVEL` commands). This approximation in\nSWAN can only be applied to open coast (unlimited supply of water from outside the\ndomain, e.g. nearshore coasts) in contrast to closed basin, e.g. lakes and\nestuaries, where this option should not be used. Note that set-up is not computed\ncorrectly with spherical coordinates.\n\nNotes\n-----\n\n* The SETUP command cannot be used in case of unstructured grids.\n* Set-up is not supported in case of parallel runs using either MPI or OpenMP.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SETUP\n    setup = SETUP()\n    print(setup.render())\n    setup = SETUP(supcor=0.5)\n    print(setup.render())",
         "properties": {
            "model_type": {
               "default": "setup",
               "description": "Model type discriminator",
               "enum": [
                  "setup",
                  "SETUP"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "supcor": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "By default the wave-induced set-up is computed with a constant added such that the set-up is zero in the deepest point in the computational grid. The user can modify this constant by the value of `supcor`. The user can thus impose a set-up in any one point (and only one) in the computational grid by first running SWAN, then reading the set-up in that point and adding or subtracting the required value of `supcor` (in m; positive if the set-up has to rise) (SWAN default: 0.0)",
               "title": "Supcor"
            }
         },
         "title": "SETUP",
         "type": "object"
      },
      "SICE": {
         "additionalProperties": false,
         "description": "Sea ice dissipation.\n\n.. code-block:: text\n\n    SICE [aice]\n\nUsing this command, the user activates a sink term to represent the dissipation of\nwave energy by sea ice. The default method is R19 empirical/parametric: a\npolynomial based on wave frequency (Rogers, 2019). This polynomial (in 1/m) has\nseven dimensional coefficients; see Scientific/Technical documentation for details.\nIf this command is not used, SWAN will not account for sea ice effects.\n\nReferences\n----------\nDoble, M.J., De Carolis, G., Meylan, M.H., Bidlot, J.R. and Wadhams, P., 2015.\nRelating wave attenuation to pancake ice thickness, using field measurements and\nmodel results. Geophysical Research Letters, 42(11), pp.4473-4481.\n\nMeylan, M.H., Bennetts, L.G. and Kohout, A.L., 2014. In situ measurements and\nanalysis of ocean waves in the Antarctic marginal ice zone. Geophysical Research\nLetters, 41(14), pp.5046-5051.\n\nRogers, W.E., Meylan, M.H. and Kohout, A.L., 2018. Frequency distribution of\ndissipation of energy of ocean waves by sea ice using data from Wave Array 3 of\nthe ONR \u201cSea State\u201d field experiment. Nav. Res. Lab. Memo. Rep, pp.18-9801.\n\nRogers, W.E., Meylan, M.H. and Kohout, A.L., 2021. Estimates of spectral wave\nattenuation in Antarctic sea ice, using model/data inversion. Cold Regions Science\nand Technology, 182, p.103198.\n\nNotes\n-----\nIis also necessary to describe the ice, using the `ICE` command (for uniform and\nstationary ice) or `INPGRID`/`READINP` commands (for variable ice).\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SICE\n    sice = SICE()\n    print(sice.render())\n    sice = SICE(aice=0.5)\n    print(sice.render())\n\nTODO: Verify if the `aice` parameter should be used with SICE command, it is not\nshown in the command tree but it is described as an option in the description.",
         "properties": {
            "model_type": {
               "default": "sice",
               "description": "Model type discriminator",
               "enum": [
                  "sice",
                  "SICE"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "aice": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ice concentration as a fraction from 0 to 1. Note that `aice` is allowed to vary over the computational region to account for the zonation of ice concentration. In that case use the commands `INPGRID AICE` and `READINP AICE` to define and read the sea concentration. The value of `aice` in this command is then not required (it will be ignored)",
               "title": "Aice"
            }
         },
         "title": "SICE",
         "type": "object"
      },
      "SICE_D15": {
         "additionalProperties": false,
         "description": "Sea ice dissipation based on the method of Doble et al. (2015).\n\n.. code-block:: text\n\n    SICE [aice] D15 [chf]\n\nReferences\n----------\nDoble, M.J., De Carolis, G., Meylan, M.H., Bidlot, J.R. and Wadhams, P., 2015.\nRelating wave attenuation to pancake ice thickness, using field measurements and\nmodel results. Geophysical Research Letters, 42(11), pp.4473-4481.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SICE_D15\n    sice = SICE_D15()\n    print(sice.render())\n    sice = SICE_D15(aice=0.2, chf=0.1)\n    print(sice.render())",
         "properties": {
            "model_type": {
               "default": "d15",
               "description": "Model type discriminator",
               "enum": [
                  "d15",
                  "D15"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "aice": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ice concentration as a fraction from 0 to 1. Note that `aice` is allowed to vary over the computational region to account for the zonation of ice concentration. In that case use the commands `INPGRID AICE` and `READINP AICE` to define and read the sea concentration. The value of `aice` in this command is then not required (it will be ignored)",
               "title": "Aice"
            },
            "chf": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "A simple coefficient of proportionality (SWAN default: 0.1)",
               "title": "Chf"
            }
         },
         "title": "SICE_D15",
         "type": "object"
      },
      "SICE_M18": {
         "additionalProperties": false,
         "description": "Sea ice dissipation based on the method of Meylan et al. (2018).\n\n.. code-block:: text\n\n    SICE [aice] M18 [chf]\n\nReferences\n----------\nMeylan, M.H., Bennetts, L.G. and Kohout, A.L., 2014. In situ measurements and\nanalysis of ocean waves in the Antarctic marginal ice zone. Geophysical Research\nLetters, 41(14), pp.5046-5051.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SICE_M18\n    sice = SICE_M18()\n    print(sice.render())\n    sice = SICE_M18(aice=0.8, chf=0.059)\n    print(sice.render())",
         "properties": {
            "model_type": {
               "default": "m18",
               "description": "Model type discriminator",
               "enum": [
                  "m18",
                  "M18"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "aice": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ice concentration as a fraction from 0 to 1. Note that `aice` is allowed to vary over the computational region to account for the zonation of ice concentration. In that case use the commands `INPGRID AICE` and `READINP AICE` to define and read the sea concentration. The value of `aice` in this command is then not required (it will be ignored)",
               "title": "Aice"
            },
            "chf": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "A simple coefficient of proportionality (SWAN default: 0.059)",
               "title": "Chf"
            }
         },
         "title": "SICE_M18",
         "type": "object"
      },
      "SICE_R19": {
         "additionalProperties": false,
         "description": "Sea ice dissipation based on the method of Rogers et al (2019).\n\n.. code-block:: text\n\n    SICE [aice] R19 [c0] [c1] [c2] [c3] [c4] [c5] [c6]\n\nThe default options recover the polynomial of Meylan et al. (2014), calibrated for\na case of ice floes, mostly 10 to 25 m in diameter, in the marginal ice zone near\nAntarctica. Examples for other calibrations can be found in the\nScientific/Technical documentation.\n\nReferences\n----------\nMeylan, M.H., Bennetts, L.G. and Kohout, A.L., 2014. In situ measurements and\nanalysis of ocean waves in the Antarctic marginal ice zone. Geophysical Research\nLetters, 41(14), pp.5046-5051.\n\nRogers, W.E., Meylan, M.H. and Kohout, A.L., 2018. Frequency distribution of\ndissipation of energy of ocean waves by sea ice using data from Wave Array 3 of\nthe ONR \u201cSea State\u201d field experiment. Nav. Res. Lab. Memo. Rep, pp.18-9801.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SICE_R19\n    sice = SICE_R19()\n    print(sice.render())\n    kwargs = dict(\n        aice=0.5,\n        c0=0.0,\n        c1=0.0,\n        c2=1.06e-3,\n        c3=0.0,\n        c4=0.0,\n        c5=0.0,\n        c6=0.0,\n    )\n    sice = SICE_R19(**kwargs)\n    print(sice.render())",
         "properties": {
            "model_type": {
               "default": "r19",
               "description": "Model type discriminator",
               "enum": [
                  "r19",
                  "R19"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "aice": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ice concentration as a fraction from 0 to 1. Note that `aice` is allowed to vary over the computational region to account for the zonation of ice concentration. In that case use the commands `INPGRID AICE` and `READINP AICE` to define and read the sea concentration. The value of `aice` in this command is then not required (it will be ignored)",
               "title": "Aice"
            },
            "c0": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in 1/m) for determining the rate of sea ice dissipation (SWAN default: 0.0)",
               "title": "C0"
            },
            "c1": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s/m) for determining the rate of sea ice dissipation (SWAN default: 0.0)",
               "title": "C1"
            },
            "c2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s2/m) for determining the rate of sea ice dissipation (SWAN default: 1.06E-3)",
               "title": "C2"
            },
            "c3": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s3/m) for determining the rate of sea ice dissipation (SWAN default: 0.0)",
               "title": "C3"
            },
            "c4": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s4/m) for determining the rate of sea ice dissipation (SWAN default: 2.3E-2)",
               "title": "C4"
            },
            "c5": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s5/m) for determining the rate of sea ice dissipation (SWAN default: 0.0)",
               "title": "C5"
            },
            "c6": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Polynomial coefficient (in s6/m) for determining the rate of sea ice dissipation (SWAN default: 0.0)",
               "title": "C6"
            }
         },
         "title": "SICE_R19",
         "type": "object"
      },
      "SICE_R21B": {
         "additionalProperties": false,
         "description": "Sea ice dissipation based on the method of Rogers et al. (2021).\n\n.. code-block:: text\n\n    SICE [aice] R21B [chf] [npf]\n\nReferences\n----------\nRogers, W.E., Meylan, M.H. and Kohout, A.L., 2021. Estimates of spectral wave\nattenuation in Antarctic sea ice, using model/data inversion. Cold Regions Science\nand Technology, 182, p.103198.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SICE_R21B\n    sice = SICE_R21B()\n    print(sice.render())\n    sice = SICE_R21B(aice=0.8, chf=2.9, npf=4.5)\n    print(sice.render())",
         "properties": {
            "model_type": {
               "default": "r21b",
               "description": "Model type discriminator",
               "enum": [
                  "r21b",
                  "R21B"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "aice": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Ice concentration as a fraction from 0 to 1. Note that `aice` is allowed to vary over the computational region to account for the zonation of ice concentration. In that case use the commands `INPGRID AICE` and `READINP AICE` to define and read the sea concentration. The value of `aice` in this command is then not required (it will be ignored)",
               "title": "Aice"
            },
            "chf": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "A simple coefficient of proportionality (SWAN default: 2.9)",
               "title": "Chf"
            },
            "npf": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the degree of dependence on frequency and ice thickness (SWAN default: 4.5)",
               "title": "Npf"
            }
         },
         "title": "SICE_R21B",
         "type": "object"
      },
      "SSWELL_ARDHUIN": {
         "additionalProperties": false,
         "description": "Nonbreaking dissipation of Ardhuin et al. (2010).\n\n.. code-block:: text\n\n    SSWELL ARDHUIN [cdsv]\n\nReferences\n----------\nArdhuin, F., Rogers, E., Babanin, A.V., Filipot, J.F., Magne, R., Roland, A.,\nVan Der Westhuysen, A., Queffeulou, P., Lefevre, J.M., Aouf, L. and Collard, F.,\n2010. Semiempirical dissipation source functions for ocean waves. Part I:\nDefinition, calibration, and validation. Journal of Physical Oceanography, 40(9),\npp.1917-1941.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SSWELL_ARDHUIN\n    sswell = SSWELL_ARDHUIN()\n    print(sswell.render())\n    sswell = SSWELL_ARDHUIN(cdsv=1.2)\n    print(sswell.render())",
         "properties": {
            "model_type": {
               "default": "ardhuin",
               "description": "Model type discriminator",
               "enum": [
                  "ardhuin",
                  "ARDHUIN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cdsv": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient related to laminar atmospheric boundary layer (SWAN default: 1.2)",
               "title": "Cdsv"
            }
         },
         "title": "SSWELL_ARDHUIN",
         "type": "object"
      },
      "SSWELL_ROGERS": {
         "additionalProperties": false,
         "description": "Nonbreaking dissipation of Rogers et al. (2012).\n\n.. code-block:: text\n\n    SSWELL ROGERS [cdsv] [feswell]\n\nReferences\n----------\nRogers, W.E., Babanin, A.V. and Wang, D.W., 2012. Observation-consistent input and\nwhitecapping dissipation in a model for wind-generated surface waves: Description\nand simple calculations. Journal of Atmospheric and Oceanic Technology, 29(9),\npp.1329-1346.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SSWELL_ROGERS\n    sswell = SSWELL_ROGERS()\n    print(sswell.render())\n    sswell = SSWELL_ROGERS(cdsv=1.2, feswell=0.5)\n    print(sswell.render())",
         "properties": {
            "model_type": {
               "default": "rogers",
               "description": "Model type discriminator",
               "enum": [
                  "rogers",
                  "ROGERS"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cdsv": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient related to laminar atmospheric boundary layer (SWAN default: 1.2)",
               "title": "Cdsv"
            },
            "feswell": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Swell dissipation factor",
               "title": "Feswell"
            }
         },
         "title": "SSWELL_ROGERS",
         "type": "object"
      },
      "SSWELL_ZIEGER": {
         "additionalProperties": false,
         "description": "Nonbreaking dissipation of Zieger et al. (2015).\n\n.. code-block:: text\n\n    SSWELL ZIEGER [b1]\n\nSwell dissipation of Young et al. (2013) updated by Zieger et al. (2015). The\nZieger option is intended for use with negative wind input via the NEGATINP\ncommand. Zieger non-breaking dissipation follows the method used in WAVEWATCH III\nversion 4 and does not include the steepness-dependent swell coefficient introduced\nin WAVEWATCH III version 5.\n\nReferences\n----------\nZieger, S., Babanin, A.V., Rogers, W.E. and Young, I.R., 2015. Observation-based\nsource terms in the third-generation wave model WAVEWATCH. Ocean Modelling, 96,\npp.2-25.\n\nYoung, I.R., Babanin, A.V. and Zieger, S., 2013. The decay rate of ocean swell\nobserved by altimeter. Journal of physical oceanography, 43(11), pp.2322-2333.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import SSWELL_ZIEGER\n    sswell = SSWELL_ZIEGER()\n    print(sswell.render())\n    sswell = SSWELL_ZIEGER(b1=0.00025)\n    print(sswell.render())",
         "properties": {
            "model_type": {
               "default": "zieger",
               "description": "Model type discriminator",
               "enum": [
                  "zieger",
                  "ZIEGER"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "b1": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Non-dimensional proportionality coefficient (SWAN default: 0.00025)",
               "title": "B1"
            }
         },
         "title": "SSWELL_ZIEGER",
         "type": "object"
      },
      "ST6": {
         "additionalProperties": false,
         "description": "St6 source terms subcomponent.\n\n.. code-block:: text\n\n    ST6 [a1sds] [a2sds] [p1sds] [p2sds] UP|DOWN HWANG|FAN|ECMWF VECTAU|SCATAU &\n        TRUE10|U10PROXY [windscaling] DEBIAS [cdfac] (AGROW [a])\n\nwind input and whitecapping from Rogers et al. (2012) (RBW12).\n\nNotes\n-----\nThe two arguments are specified in the Appendix C of the User manual but not in the\ncommand description for WESTH in Section 4.5.4. They are also options in the\nWCAPPING command. It is not entirely clear if they should/could be specified here.\n\nReferences\n----------\nFan, Y., Lin, S.J., Held, I.M., Yu, Z. and Tolman, H.L., 2012. Global ocean surface\nwave simulation using a coupled atmosphere\u2013wave model. Journal of Climate, 25(18),\npp.6233-6252.\n\nRogers, W.E., Babanin, A.V. and Wang, D.W., 2012. Observation-consistent input and\nwhitecapping dissipation in a model for wind-generated surface waves: Description\nand simple calculations. Journal of Atmospheric and Oceanic Technology, 29(9),\npp.1329-1346.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6\n    st6 = ST6(a1sds=4.7e-7, a2sds=6.6e-6)\n    print(st6.render())\n    kwargs = dict(\n        a1sds=2.8e-6,\n        a2sds=3.5e-5,\n        normalization=\"up\",\n        wind_drag=\"hwang\",\n        tau=\"vectau\",\n        u10=\"u10proxy\",\n        windscaling=32.0,\n        cdfac=0.89,\n        agrow=True,\n        a=0.0015,\n    )\n    st6 = ST6(**kwargs)\n    print(st6.render())",
         "properties": {
            "model_type": {
               "const": "st6",
               "default": "st6",
               "description": "Model type discriminator",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "hwang",
               "description": "Wind drag formula, `hwang` is the default and is unchanged from RBW12, `fan` is from Fan et al. (2012), `ecmwf` follows WAM Cycle 4 methodology",
               "enum": [
                  "hwang",
                  "fan",
                  "ecmwf"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "default": false,
               "description": "Activate the Cavaleri and Malanotte (1981) wave growth term",
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "description": "Coefficient related to local dissipation term T1 (a1 in RBW12)",
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "description": "Coefficient related to local dissipation term T2 (a2 in RBW12)",
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Power coefficient controlling strength of dissipation term T1 (L in RBW12, SWAN default: 4)",
               "title": "P1Sds"
            },
            "p2sds": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Power coefficient controlling strength of dissipation term T2 (M in RBW12, SWAN default: 4)",
               "title": "P2Sds"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": 32.0,
               "description": "Factor to scale U10 with U* when using U10PROXY",
               "title": "Windscaling"
            },
            "cdfac": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Counter bias in the input wind fields by providing a multiplier on the drag coefficient",
               "title": "Cdfac"
            }
         },
         "required": [
            "a1sds",
            "a2sds"
         ],
         "title": "ST6",
         "type": "object"
      },
      "ST6C1": {
         "additionalProperties": false,
         "description": "First ST6 calibration in the SWAN user manual.\n\n.. code-block:: text\n\n    ST6 4.7e-7 6.6e-6 4.0 4.0 UP HWANG VECTAU U10PROXY 28.0 AGROW\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6C1\n    st6 = ST6C1()\n    print(st6.render())",
         "properties": {
            "model_type": {
               "const": "st6c1",
               "default": "st6c1",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "hwang",
               "description": "Wind drag formula, `hwang` is the default and is unchanged from RBW12, `fan` is from Fan et al. (2012), `ecmwf` follows WAM Cycle 4 methodology",
               "enum": [
                  "hwang",
                  "fan",
                  "ecmwf"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "const": true,
               "default": true,
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "const": 4.7e-07,
               "default": 4.7e-07,
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "const": 6.6e-06,
               "default": 6.6e-06,
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P1Sds",
               "type": "number"
            },
            "p2sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P2Sds",
               "type": "number"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "const": 28.0,
               "default": 28.0,
               "title": "Windscaling",
               "type": "number"
            },
            "cdfac": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Counter bias in the input wind fields by providing a multiplier on the drag coefficient",
               "title": "Cdfac"
            }
         },
         "title": "ST6C1",
         "type": "object"
      },
      "ST6C2": {
         "additionalProperties": false,
         "description": "Second ST6 calibration in the SWAN user manual.\n\n.. code-block:: text\n\n    ST6 4.7e-7 6.6e-6 4.0 4.0 UP FAN VECTAU U10PROXY 28.0 AGROW\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6C2\n    st6 = ST6C2()\n    print(st6.render())\n\nTODO: Ensure validator is reused here so fan and debias are not used together.",
         "properties": {
            "model_type": {
               "const": "st6c2",
               "default": "st6c2",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "const": "fan",
               "default": "fan",
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "const": true,
               "default": true,
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "const": 4.7e-07,
               "default": 4.7e-07,
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "const": 6.6e-06,
               "default": 6.6e-06,
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P1Sds",
               "type": "number"
            },
            "p2sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P2Sds",
               "type": "number"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "const": 28.0,
               "default": 28.0,
               "title": "Windscaling",
               "type": "number"
            },
            "cdfac": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Counter bias in the input wind fields by providing a multiplier on the drag coefficient",
               "title": "Cdfac"
            }
         },
         "title": "ST6C2",
         "type": "object"
      },
      "ST6C3": {
         "additionalProperties": false,
         "description": "Third ST6 calibration in the SWAN user manual.\n\n.. code-block:: text\n\n    ST6 2.8e-6 3.5e-5 4.0 4.0 UP HWANG VECTAU U10PROXY 32.0 AGROW\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6C3\n    st6 = ST6C3()\n    print(st6.render())",
         "properties": {
            "model_type": {
               "const": "st6c3",
               "default": "st6c3",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "hwang",
               "description": "Wind drag formula, `hwang` is the default and is unchanged from RBW12, `fan` is from Fan et al. (2012), `ecmwf` follows WAM Cycle 4 methodology",
               "enum": [
                  "hwang",
                  "fan",
                  "ecmwf"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "const": true,
               "default": true,
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "const": 2.8e-06,
               "default": 2.8e-06,
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "const": 3.5e-05,
               "default": 3.5e-05,
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P1Sds",
               "type": "number"
            },
            "p2sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P2Sds",
               "type": "number"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "const": 32.0,
               "default": 32.0,
               "title": "Windscaling",
               "type": "number"
            },
            "cdfac": {
               "anyOf": [
                  {
                     "exclusiveMinimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Counter bias in the input wind fields by providing a multiplier on the drag coefficient",
               "title": "Cdfac"
            }
         },
         "title": "ST6C3",
         "type": "object"
      },
      "ST6C4": {
         "additionalProperties": false,
         "description": "Fourth ST6 calibration in the SWAN user manual.\n\n.. code-block:: text\n\n    ST6 2.8e-6 3.5e-5 4.0 4.0 UP HWANG VECTAU U10PROXY 32.0 DEBIAS 0.89 AGROW\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6C4\n    st6 = ST6C4()\n    print(st6.render())",
         "properties": {
            "model_type": {
               "const": "st6c4",
               "default": "st6c4",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "hwang",
               "description": "Wind drag formula, `hwang` is the default and is unchanged from RBW12, `fan` is from Fan et al. (2012), `ecmwf` follows WAM Cycle 4 methodology",
               "enum": [
                  "hwang",
                  "fan",
                  "ecmwf"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "const": true,
               "default": true,
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "const": 2.8e-06,
               "default": 2.8e-06,
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "const": 3.5e-05,
               "default": 3.5e-05,
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P1Sds",
               "type": "number"
            },
            "p2sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P2Sds",
               "type": "number"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "const": 32.0,
               "default": 32.0,
               "title": "Windscaling",
               "type": "number"
            },
            "cdfac": {
               "const": 0.89,
               "default": 0.89,
               "title": "Cdfac",
               "type": "number"
            }
         },
         "title": "ST6C4",
         "type": "object"
      },
      "ST6C5": {
         "additionalProperties": false,
         "description": "Fifth ST6 calibration in the SWAN user manual.\n\n.. code-block:: text\n\n    ST6 4.7e-7 6.6e-6 4.0 4.0 UP HWANG VECTAU U10PROXY 28.0 AGROW\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import ST6C5\n    st6 = ST6C5()\n    print(st6.render())",
         "properties": {
            "model_type": {
               "const": "st6c5",
               "default": "st6c5",
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "hwang",
               "description": "Wind drag formula, `hwang` is the default and is unchanged from RBW12, `fan` is from Fan et al. (2012), `ecmwf` follows WAM Cycle 4 methodology",
               "enum": [
                  "hwang",
                  "fan",
                  "ecmwf"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "const": true,
               "default": true,
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "a1sds": {
               "const": 6.5e-06,
               "default": 6.5e-06,
               "title": "A1Sds",
               "type": "number"
            },
            "a2sds": {
               "const": 8.5e-05,
               "default": 8.5e-05,
               "title": "A2Sds",
               "type": "number"
            },
            "p1sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P1Sds",
               "type": "number"
            },
            "p2sds": {
               "const": 4.0,
               "default": 4.0,
               "title": "P2Sds",
               "type": "number"
            },
            "normalization": {
               "default": "up",
               "description": "Selection of normalization of exceedance level by ET(f) (`up`) or E(f) (`down`) as in RBW12 (right column, page 1333), `up` is default and strongly recommended",
               "enum": [
                  "up",
                  "down"
               ],
               "title": "Normalization",
               "type": "string"
            },
            "tau": {
               "default": "vectau",
               "description": "Use vector (vectau) or scalar (scatau) calculation for the wind strerss (Eq. 12 in RBW12), `vectau` is the default and strongly recommended",
               "enum": [
                  "vectau",
                  "scatau"
               ],
               "title": "Tau",
               "type": "string"
            },
            "u10": {
               "default": "u10proxy",
               "description": "Wind velocity definition",
               "enum": [
                  "u10proxy",
                  "true10"
               ],
               "title": "U10",
               "type": "string"
            },
            "windscaling": {
               "const": 35.0,
               "default": 35.0,
               "title": "Windscaling",
               "type": "number"
            },
            "cdfac": {
               "const": 0.89,
               "default": 0.89,
               "title": "Cdfac",
               "type": "number"
            }
         },
         "title": "ST6C5",
         "type": "object"
      },
      "SURFBEAT": {
         "additionalProperties": false,
         "description": "Surfbeat.\n\n.. code-block:: text\n\n    SURFBEAT [df] [nmax] [emin] UNIFORM/LOGARITHMIC\n\nUsing this optional command, the user activates the Infragravity Energy Module\n(IEM) of Reniers and Zijlema (2022). Besides the energy balance equation for a\nsea-swell wave field, another energy balance is included to account for the\ntransfer of sea-swell energy to the bound infragravity (BIG) wave. This\ninfragravity energy balance also involves a nonlinear transfer, expressed by the\nbiphase, through the phase coupling between the radiation stress forcing and the\nBIG wave. For the prediction of the biphase for obliquely incident waves, an\nevolution equation is provided under the assumption that the bottom slopes are mild\nand alongshore uniform.\n\nReferences\n----------\nReniers, A. and Zijlema, M., 2022. Swan surfbeat-1d. Coastal Engineering, 172,\np.104068.\n\nExamples:\n---------\n\n.. ipython:: python\n\n    from rompy.swan.components.physics import SURFBEAT\n    surfbeat = SURFBEAT()\n    print(surfbeat.render())\n    surfbeat = SURFBEAT(df=0.01, nmax=50000, emin=0.05, spacing=\"logarithmic\")\n    print(surfbeat.render())",
         "properties": {
            "model_type": {
               "default": "surfbeat",
               "description": "Model type discriminator",
               "enum": [
                  "surfbeat",
                  "SURFBEAT"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "df": {
               "anyOf": [
                  {
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The constant size of BIG frequency bin (in Hz) (SWAN default: 0.01)",
               "title": "Df"
            },
            "nmax": {
               "anyOf": [
                  {
                     "minimum": 0,
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The maximum number of short-wave pairs for creating bichromatic wave groups (SWAN default: 50000)",
               "title": "Nmax"
            },
            "emin": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The energy threshold in fraction of energy spectrum peak. With this threshold one takes into account those short wave components to create bichromatic wave groups while their energy levels are larger than `emin x E_max` with `E_max` the peak of the spectrum (SWAN default: 0.05)",
               "title": "Emin"
            },
            "spacing": {
               "anyOf": [
                  {
                     "enum": [
                        "uniform",
                        "logarithmic"
                     ],
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Define if frequencies for reflected ig waves are uniformly or logarithmically distributed",
               "title": "Spacing"
            }
         },
         "title": "SURFBEAT",
         "type": "object"
      },
      "TRANS1D": {
         "additionalProperties": false,
         "description": "Frequency dependent transmission.\n\n.. code-block:: text\n\n    TRANS1D < [trcoef] >\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import TRANS1D\n    transm = TRANS1D(trcoef=[0.0, 0.0, 0.2, 0.5, 0.2, 0.0, 0.0])\n    print(transm.render())",
         "properties": {
            "model_type": {
               "default": "trans1d",
               "description": "Model type discriminator",
               "enum": [
                  "trans1d",
                  "TRANS1D"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trcoef": {
               "description": "Transmission coefficient (ratio of transmitted over incoming significant wave height) per frequency. The number of these transmission values must be equal to the number of frequencies, i.e. `msc` + 1",
               "items": {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
               },
               "title": "Trcoef",
               "type": "array"
            }
         },
         "required": [
            "trcoef"
         ],
         "title": "TRANS1D",
         "type": "object"
      },
      "TRANS2D": {
         "additionalProperties": false,
         "description": "Frequency-direction dependent transmission.\n\n.. code-block:: text\n\n    TRANS2D < [trcoef] >\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import TRANS2D\n    trcoef = np.array([[0.0, 0.0], [0.1, 0.1], [0.2, 0.2]])\n    transm = TRANS2D(trcoef=trcoef)\n    print(transm.render())",
         "properties": {
            "model_type": {
               "default": "trans2d",
               "description": "Model type discriminator",
               "enum": [
                  "trans2d",
                  "TRANS2D"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trcoef": {
               "description": "Transmission coefficient (ratio of transmitted over incoming significant wave height) per frequency and direction, rows represent directions and columns represent frequencies",
               "properties": {
                  "data_type": {
                     "default": "Any",
                     "title": "dtype",
                     "type": "string"
                  },
                  "data": {
                     "items_schema": {
                        "items_schema": {
                           "type": "any"
                        },
                        "type": "list"
                     },
                     "max_length": 2,
                     "min_length": 2,
                     "type": "list"
                  }
               },
               "required": [
                  "data_type",
                  "data"
               ],
               "title": "Numpy Array",
               "type": "np.ndarray[tuple[int, int], np.dtype[Any]]"
            }
         },
         "required": [
            "trcoef"
         ],
         "title": "TRANS2D",
         "type": "object"
      },
      "TRANSM": {
         "additionalProperties": false,
         "description": "Constant transmission coefficient.\n\n.. code-block:: text\n\n    TRANSM [trcoef]\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import TRANSM\n    transm = TRANSM()\n    print(transm.render())\n    transm = TRANSM(trcoef=0.5)\n    print(transm.render())",
         "properties": {
            "model_type": {
               "default": "transm",
               "description": "Model type discriminator",
               "enum": [
                  "transm",
                  "TRANSM"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trcoef": {
               "anyOf": [
                  {
                     "maximum": 1.0,
                     "minimum": 0.0,
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Constant transmission coefficient (ratio of transmitted over incoming significant wave height) (SWAN default: 0.0) (no transmission = complete blockage)",
               "title": "Trcoef"
            }
         },
         "title": "TRANSM",
         "type": "object"
      },
      "TRIAD": {
         "additionalProperties": false,
         "description": "Wave triad interactions.\n\n.. code-block:: text\n\n    TRIAD [itriad] [trfac] [cutfr] [a] [b] [urcrit] [urslim]\n\nWith this command the user can activate the triad wave-wave interactions. If this\ncommand is not used, SWAN will not account for triads.\n\nNote\n----\nThis is the TRIAD specification in SWAN < 41.45.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import TRIAD\n    triad = TRIAD()\n    print(triad.render())\n    triad = TRIAD(\n        itriad=1,\n        trfac=0.8,\n        cutfr=2.5,\n        a=0.95,\n        b=-0.75,\n        ucrit=0.2,\n        urslim=0.01,\n    )\n    print(triad.render())",
         "properties": {
            "model_type": {
               "default": "triad",
               "description": "Model type discriminator",
               "enum": [
                  "triad",
                  "TRIAD"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "itriad": {
               "anyOf": [
                  {
                     "enum": [
                        1,
                        2
                     ],
                     "type": "integer"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Approximation method for the triad computation: \n\n* 1: the LTA method of Eldeberky (1996) \n* 2: the SPB method of Becq-Girard et al. (1999) (SWAN default: 1)",
               "title": "Itriad"
            },
            "trfac": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient (SWAN default: 0.8 in case of LTA method, 0.9 in case of SPB method)",
               "title": "Trfac"
            },
            "cutfr": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the maximum frequency that is considered in the LTA computation. The value of `cutfr` is the ratio of this maximum frequency over the mean frequency (SWAN default: 2.5)",
               "title": "Cutfr"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "First calibration parameter for tuning K in Eq. (5.1) of Becq-Girard et al. (1999). This parameter is associated with broadening of the resonance condition (SWAN default: 0.95)",
               "title": "A"
            },
            "b": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Second calibration parameter for tuning K in Eq. (5.1) of Becq-Girard et al. (1999). This parameter is associated with broadening of the resonance condition (SWAN default: -0.75 for 1D, 0.0 for 2D",
               "title": "B"
            },
            "ucrit": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The critical Ursell number appearing in the expression for the biphase (SWAN default: 0.2)",
               "title": "Ucrit"
            },
            "urslim": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The lower threshold for Ursell number, if the actual Ursell number is below this value triad interactions are be computed (SWAN default: 0.01)",
               "title": "Urslim"
            }
         },
         "title": "TRIAD",
         "type": "object"
      },
      "TRIAD_DCTA": {
         "additionalProperties": false,
         "description": "Triad interactions with the DCTA method of Booij et al. (2009).\n\n.. code-block:: text\n\n    TRIAD DCTA [trfac] [p] COLL|NONC BIPHHASE ELDEBERKY|DEWIT\n\nReferences\n----------\nBooij, N., Holthuijsen, L.H. and B\u00e9nit, M.P., 2009. A distributed collinear triad\napproximation in SWAN. In Proceedings Of Coastal Dynamics 2009: Impacts of Human\nActivities on Dynamic Coastal Processes (With CD-ROM) (pp. 1-10).\n\nNote\n----\nThis is the default method to compute the triad interactions in SWAN >= 41.45, it\nis not supported in earlier versions of the model.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import TRIAD_DCTA\n    triad = TRIAD_DCTA()\n    print(triad.render())\n    triad = TRIAD_DCTA(\n        trfac=4.4,\n        p=1.3,\n        noncolinear=True,\n        biphase={\"model_type\": \"dewit\", \"lpar\": 0.0},\n    )\n    print(triad.render())",
         "properties": {
            "model_type": {
               "default": "dcta",
               "description": "Model type discriminator",
               "enum": [
                  "dcta",
                  "DCTA"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trfac": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Scaling factor that controls the intensity of the triad interaction due to DCTA (SWAN default: 4.4)",
               "title": "Trfac"
            },
            "p": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Shape coefficient to force the high-frequency tail(SWAN default: 4/3)",
               "title": "P"
            },
            "noncolinear": {
               "default": false,
               "description": "If True, the noncolinear triad interactions with the DCTA framework are accounted for",
               "title": "Noncolinear",
               "type": "boolean"
            },
            "biphase": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ELDEBERKY"
                  },
                  {
                     "$ref": "#/$defs/DEWIT"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Defines the parameterization of biphase (self-self interaction) (SWAN default: ELDEBERKY)",
               "title": "Biphase"
            }
         },
         "title": "TRIAD_DCTA",
         "type": "object"
      },
      "TRIAD_LTA": {
         "additionalProperties": false,
         "description": "Triad interactions with the LTA method of Eldeberky (1996).\n\n.. code-block:: text\n\n    TRIAD LTA [trfac] [cutfr] BIPHHASE ELDEBERKY|DEWIT\n\nReferences\n----------\nEldeberky, Y., Polnikov, V. and Battjes, J.A., 1996. A statistical approach for\nmodeling triad interactions in dispersive waves. In Coastal Engineering 1996\n(pp. 1088-1101).\n\nNote\n----\nThis method to compute the triad interactions is only supported in SWAN >= 41.45.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import TRIAD_LTA\n    triad = TRIAD_LTA()\n    print(triad.render())\n    triad = TRIAD_LTA(\n        trfac=0.8,\n        cutfr=2.5,\n        biphase={\"model_type\": \"eldeberky\", \"urcrit\": 0.63},\n    )\n    print(triad.render())",
         "properties": {
            "model_type": {
               "default": "lta",
               "description": "Model type discriminator",
               "enum": [
                  "lta",
                  "LTA"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trfac": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Scaling factor that controls the intensity of the triad interaction due to LTA (SWAN default: 0.8)",
               "title": "Trfac"
            },
            "cutfr": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Controls the maximum frequency that is considered in the LTA computation. The value of `cutfr` is the ratio of this maximum frequency over the mean frequency (SWAN default: 2.5)",
               "title": "Cutfr"
            },
            "biphase": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ELDEBERKY"
                  },
                  {
                     "$ref": "#/$defs/DEWIT"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Defines the parameterization of biphase (self-self interaction) (SWAN default: ELDEBERKY)",
               "title": "Biphase"
            }
         },
         "title": "TRIAD_LTA",
         "type": "object"
      },
      "TRIAD_SPB": {
         "additionalProperties": false,
         "description": "Triad interactions with the SPB method of Becq-Girard et al. (1999).\n\n.. code-block:: text\n\n    TRIAD SPB [trfac] [a] [b] BIPHHASE ELDEBERKY|DEWIT\n\nReferences\n----------\nBecq-Girard, F., Forget, P. and Benoit, M., 1999. Non-linear propagation of\nunidirectional wave fields over varying topography. Coastal Engineering, 38(2),\npp.91-113.\n\nNote\n----\nThis method to compute the triad interactions is only supported in SWAN >= 41.45.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import TRIAD_SPB\n    triad = TRIAD_SPB()\n    print(triad.render())\n    triad = TRIAD_SPB(\n        trfac=0.9,\n        a=0.95,\n        b=0.0,\n        biphase={\"model_type\": \"eldeberky\", \"urcrit\": 0.63},\n    )\n    print(triad.render())",
         "properties": {
            "model_type": {
               "default": "spb",
               "description": "Model type discriminator",
               "enum": [
                  "spb",
                  "SPB"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "trfac": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Scaling factor that controls the intensity of the triad interaction due to SPB (SWAN default: 0.9)",
               "title": "Trfac"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "First calibration parameter for tuning K in Eq. (5.1) of Becq-Girard et al. (1999). This parameter is associated with broadening of the resonance condition. The default value is 0.95 and is calibrated by means of laboratory experiments (SWAN default: 0.95)",
               "title": "A"
            },
            "b": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Second calibration parameter for tuning K in Eq. (5.1) of Becq-Girard et al. (1999). This parameter is associated with broadening of the resonance condition. The default value is -0.75 and is calibrated by means of laboratory experiments. However, it may not be appropriate for true 2D field cases as it does not scale with the wave field characteristics. Hence, this parameter is set to zero (SWAN default: 0.0)",
               "title": "B"
            },
            "biphase": {
               "anyOf": [
                  {
                     "$ref": "#/$defs/ELDEBERKY"
                  },
                  {
                     "$ref": "#/$defs/DEWIT"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Defines the parameterization of biphase (self-self interaction) (SWAN default: ELDEBERKY)",
               "title": "Biphase"
            }
         },
         "title": "TRIAD_SPB",
         "type": "object"
      },
      "TURBULENCE": {
         "additionalProperties": false,
         "description": "Turbulent viscosity.\n\n.. code-block:: text\n\n    TURBULENCE [ctb] (CURRENT [tbcur])\n\nWith this optional command the user can activate turbulent viscosity. This physical\neffect is also activated by reading values of the turbulent viscosity using the\n`READGRID TURB` command, but then with the default value of `ctb`. The command\n`READGRID TURB` is necessary if this command `TURB` is used since the value of the\nviscosity is assumed to vary over space.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import TURBULENCE\n    turbulence = TURBULENCE(current=False)\n    print(turbulence.render())\n    turbulence = TURBULENCE(ctb=0.01, current=True, tbcur=0.004)\n    print(turbulence.render())",
         "properties": {
            "model_type": {
               "default": "turbulence",
               "description": "Model type discriminator",
               "enum": [
                  "turbulence",
                  "TURBULENCE"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "ctb": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The value of the proportionality coefficient appearing in the energy dissipation term (SWAN default: 0.01)",
               "title": "Ctb"
            },
            "current": {
               "anyOf": [
                  {
                     "type": "boolean"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": true,
               "description": "If this keyword is present the turbulent viscosity will be derived from the product of the depth and the absolute value of the current velocity. If the command `READGRID TURB` is used, this option is ignored; the values read from file will prevail",
               "title": "Current"
            },
            "tbcur": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "The factor by which depth x current velocity is multiplied in order to get the turbulent viscosity (SWAN default: 0.004)",
               "title": "Tbcur"
            }
         },
         "title": "TURBULENCE",
         "type": "object"
      },
      "VEGETATION": {
         "additionalProperties": false,
         "description": "Vegetation dumping.\n\n.. code-block:: text\n\n    VEGETATION [iveg] < [height] [diamtr] [nstems] [drag] >\n\nWith this command the user can activate wave damping due to vegetation based on the\nDalrymple's formula (1984) as implemented by Suzuki et al. (2011). This damping is\nuniform over the wave frequencies. An alternative is the frequency-dependent\n(canopy) dissipation model of Jacobsen et al. (2019). If this command is not used,\nSWAN will not account for vegetation effects.\n\nThe vegetation (rigid plants) can be divided over a number of vertical segments and\nso, the possibility to vary the vegetation vertically is included. Each vertical\nlayer represents some characteristics of the plants. These variables as indicated\nbelow can be repeated as many vertical layers to be chosen.\n\nReferences\n----------\nDalrymple, R.A., Kirby, J.T. and Hwang, P.A., 1984. Wave diffraction due to areas\nof energy dissipation. Journal of waterway, port, coastal, and ocean engineering,\n110(1), pp.67-79.\n\nJacobsen, N.G., Bakker, W., Uijttewaal, W.S. and Uittenbogaard, R., 2019.\nExperimental investigation of the wave-induced motion of and force distribution\nalong a flexible stem. Journal of Fluid Mechanics, 880, pp.1036-1069.\n\nSuzuki, T., Zijlema, M., Burger, B., Meijer, M.C. and Narayan, S., 2012. Wave\ndissipation by vegetation with layer schematization in SWAN. Coastal Engineering,\n59(1), pp.64-71.\n\nNotes\n-----\nVertical layering of the vegetation is not yet implemented for the\nJacobsen et al. (2019) method.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import VEGETATION\n    # Single layer\n    vegetation = VEGETATION(\n        height=1.2,\n        diamtr=0.1,\n        drag=0.5,\n        nstems=10,\n    )\n    print(vegetation.render())\n    # 2 vertical layers\n    vegetation = VEGETATION(\n        iveg=1,\n        height=[1.2, 0.8],\n        diamtr=[0.1, 0.1],\n        drag=[0.5, 0.5],\n        nstems=[10, 5],\n    )\n    print(vegetation.render())",
         "properties": {
            "model_type": {
               "default": "vegetation",
               "description": "Model type discriminator",
               "enum": [
                  "vegetation",
                  "VEGETATION"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "iveg": {
               "default": 1,
               "description": "Indicates the method for the vegetation computation (SWAN default: 1):\n\n* 1: Suzuki et al. (2011)\n* 2: Jacobsen et al. (2019)\n",
               "enum": [
                  1,
                  2
               ],
               "title": "Iveg",
               "type": "integer"
            },
            "height": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "items": {
                        "type": "number"
                     },
                     "type": "array"
                  }
               ],
               "description": "The plant height per layer (in m)",
               "title": "Height"
            },
            "diamtr": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "items": {
                        "type": "number"
                     },
                     "type": "array"
                  }
               ],
               "description": "The diameter of each plant stand per layer (in m)",
               "title": "Diamtr"
            },
            "drag": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "items": {
                        "type": "number"
                     },
                     "type": "array"
                  }
               ],
               "description": "The drag coefficient per layer",
               "title": "Drag"
            },
            "nstems": {
               "anyOf": [
                  {
                     "type": "integer"
                  },
                  {
                     "items": {
                        "type": "integer"
                     },
                     "type": "array"
                  }
               ],
               "default": 1,
               "description": "The number of plant stands per square meter for each layer. Note that `nstems` is allowed to vary over the computational region to account for the zonation of vegetation. In that case use the commands `IMPGRID NPLANTS` and `READINP NPLANTS` to define and read the vegetation density. The (vertically varying) value of `nstems` in this command will be multiplied by this horizontally varying plant density (SWAN default: 1)",
               "title": "Nstems"
            }
         },
         "required": [
            "height",
            "diamtr",
            "drag"
         ],
         "title": "VEGETATION",
         "type": "object"
      },
      "WCAPPING_AB": {
         "additionalProperties": false,
         "description": "Whitecapping according to Alves and Banner (2003).\n\n.. code-block:: text\n\n    WCAPPING AB [cds2] [br] CURRENT [cds3]\n\nReferences\n----------\nAlves, J.H.G. and Banner, M.L., 2003. Performance of a saturation-based\ndissipation-rate source term in modeling the fetch-limited evolution of wind waves.\nJournal of Physical Oceanography, 33(6), pp.1274-1298.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import WCAPPING_AB\n    wcapping = WCAPPING_AB()\n    print(wcapping.render())\n    wcapping = WCAPPING_AB(cds2=5.0e-5, br=1.75e-3, current=True, cds3=0.8)\n    print(wcapping.render())",
         "properties": {
            "model_type": {
               "default": "ab",
               "description": "Model type discriminator",
               "enum": [
                  "ab",
                  "AB"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cds2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "proportionality coefficient due to Alves and Banner (2003) (SWAN default: 5.0e-5)",
               "title": "Cds2"
            },
            "br": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Threshold saturation level\t(SWAN default: 1.75e-3)",
               "title": "Br"
            },
            "current": {
               "default": false,
               "description": "Indicates that enhanced current-induced dissipation as proposed by Van der Westhuysen (2012) is to be added",
               "title": "Current",
               "type": "boolean"
            },
            "cds3": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient (SWAN default: 0.8)",
               "title": "Cds3"
            }
         },
         "title": "WCAPPING_AB",
         "type": "object"
      },
      "WCAPPING_KOMEN": {
         "additionalProperties": false,
         "description": "Whitecapping according to Komen (1984).\n\n.. code-block:: text\n\n    WCAPPING KOMEN [cds2] [stpm] [powst] [delta] [powk]\n\nNotes\n-----\nThe SWAN default for `delta` has been changed since version 40.91A. The setting\n`delta = 1` will improve the prediction of the wave energy at low frequencies, and\nhence the mean wave period. The original default was `delta = 0`, which corresponds\nto WAM Cycle 3. See the Scientific/Technical documentation for further details.\n\nReferences\n----------\nKomen, G.J., Hasselmann, S. and Hasselmann, K., 1984. On the existence of a fully\ndeveloped wind-sea spectrum. Journal of physical oceanography, 14(8), pp.1271-1285.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.components.physics import WCAPPING_KOMEN\n    wcapping = WCAPPING_KOMEN()\n    print(wcapping.render())\n    wcapping = WCAPPING_KOMEN(cds2=2.36e-5, stpm=3.02e-3, powst=2, delta=1, powk=2)\n    print(wcapping.render())",
         "properties": {
            "model_type": {
               "default": "komen",
               "description": "Model type discriminator",
               "enum": [
                  "komen",
                  "KOMEN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "cds2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient for determining the rate of whitecapping dissipation ($Cds$) (SWAN default: 2.36e-5)",
               "title": "Cds2"
            },
            "stpm": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Value of the wave steepness for a Pierson-Moskowitz spectrum ($s^2_{PM}$) (SWAN default: 3.02e-3)",
               "title": "Stpm"
            },
            "powst": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Power of steepness normalized with the wave steepness of a Pierson-Moskowitz spectrum (SWAN default: 2)",
               "title": "Powst"
            },
            "delta": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Coefficient which determines the dependency of the whitecapping on wave number (SWAN default: 1)",
               "title": "Delta"
            },
            "powk": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "power of wave number normalized with the mean wave number (SWAN default: 1)",
               "title": "Powk"
            }
         },
         "title": "WCAPPING_KOMEN",
         "type": "object"
      },
      "WESTHUYSEN": {
         "additionalProperties": false,
         "description": "Westhuysen source terms subcomponent.\n\n.. code-block:: text\n\n    WESTHUYSEN [cds2] [br] (AGROW [a])\n\nNonlinear saturation-based whitecapping combined with wind input of Yan (1987).\n\nNotes\n-----\nThe two arguments are specified in the Appendix C of the User manual but not in the\ncommand description for WESTH in Section 4.5.4. They are also options in the\nWCAPPING command. It is not entirely clear if they should/could be specified here.\n\nReferences\n----------\nvan der Westhuysen, A.J., Zijlema, M. and Battjes, J.A., 2007. Nonlinear\nsaturation-based whitecapping dissipation in SWAN for deep and shallow water.\nCoastal Engineering, 54(2), pp.151-170.\n\nExamples\n--------\n\n.. ipython:: python\n    :okwarning:\n\n    from rompy.swan.subcomponents.physics import WESTHUYSEN\n    westhuysen = WESTHUYSEN()\n    print(westhuysen.render())\n    westhuysen = WESTHUYSEN(cds2=5.0e-5, br=1.75e-3)\n    print(westhuysen.render())",
         "properties": {
            "model_type": {
               "default": "westhuysen",
               "description": "Model type discriminator",
               "enum": [
                  "westhuysen",
                  "WESTHUYSEN"
               ],
               "title": "Model Type",
               "type": "string"
            },
            "wind_drag": {
               "default": "wu",
               "description": "Indicates the wind drag formulation",
               "enum": [
                  "wu",
                  "fit"
               ],
               "title": "Wind Drag",
               "type": "string"
            },
            "agrow": {
               "default": false,
               "description": "Activate the Cavaleri and Malanotte (1981) wave growth term",
               "title": "Agrow",
               "type": "boolean"
            },
            "a": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Proportionality coefficient when activating the Cavaleri and Malanotte (1981) wave growth term (SWAN default: 0.0015)",
               "title": "A"
            },
            "cds2": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "proportionality coefficient due to Alves and Banner (2003) (SWAN default: 5.0e-5).",
               "title": "Cds2"
            },
            "br": {
               "anyOf": [
                  {
                     "type": "number"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "description": "Threshold saturation level\t(SWAN default: 1.75e-3)",
               "title": "Br"
            }
         },
         "title": "WESTHUYSEN",
         "type": "object"
      }
   },
   "additionalProperties": false
}

Fields:
Validators:
field bragg: BRAGG | BRAGG_FT | BRAGG_FILE | None = None#
Validated by:
field breaking: BREAKING_CONSTANT | BREAKING_BKD | None = None#
Validated by:
field deactivate: OFFS | None = None#
Validated by:
field diffraction: DIFFRACTION | None = None#
Validated by:
field friction: FRICTION_JONSWAP | FRICTION_COLLINS | FRICTION_MADSEN | FRICTION_RIPPLES | None = None#
Validated by:
field gen: GEN1 | GEN2 | GEN3 | None = None#
Validated by:
field limiter: LIMITER | None = None#
Validated by:
field model_type: Literal['physics', 'PHYSICS'] = 'physics'#

Model type discriminator

Validated by:
field mud: MUD | None = None#
Validated by:
field negatinp: NEGATINP | None = None#
Validated by:
field obstacle: OBSTACLES | None = None#
Validated by:
field quadrupl: QUADRUPL | None = None#
Validated by:
field scat: SCAT | None = None#
Validated by:
field setup: SETUP | None = None#
Validated by:
field sice: SICE | SICE_R19 | SICE_D15 | SICE_M18 | SICE_R21B | None = None#
Validated by:
field sswell: SSWELL_ROGERS | SSWELL_ARDHUIN | SSWELL_ZIEGER | None = None#
Validated by:
field surfbeat: SURFBEAT | None = None#
Validated by:
field triad: TRIAD | TRIAD_DCTA | TRIAD_LTA | TRIAD_SPB | None = None#
Validated by:
field turbulence: TURBULENCE | None = None#
Validated by:
field vegetation: VEGETATION | None = None#
Validated by:
field wcapping: WCAPPING_KOMEN | WCAPPING_AB | None = None#
Validated by:
cmd()[source]#

Return the string or list of strings to render the component to the CMD.

validator deactivate_physics  »  deactivate[source]#

Convert OFF to OFFS so list is rendered.

validator negatinp_only_with_zieger  »  all fields[source]#

Log a warning if NEGATINP is used with a non-ZIEGER SSWELL.