...
This is a special bus which is only valid for the surface schemes which do not have access to any of the busses described above! However, fields from this bus still need to get declared in sfc_businit.F90 or phyvar.hf the in the volatile or permanent bus. To get them copied to the surface bus one needs to add them' in sfcbus_mod.F90 with:
Volet |
---|
SFCVAR(name_sfc, name_bus) |
Where:
'name_sfc' is the name the field will have in the surface bus and
'name_bus' is the "VN" name the one of the busses above.
...
To be able to treat the fields from the busses like "normal" 1-D (row) or 2-D (slab) fields (remember the physics only see one row or slab at the time - see above) they usually get "transformed" into regular 1-D or 2-D fields by using pointers the following way:
a) Declare Declaration of the field as 1-D or 2-D pointer, for example:
...
Volet |
---|
real, pointer, dimension(:) :: zpmoins real, pointer, dimension(:,:) :: ztmoins |
In general, the 1-D or 2-D field name is the same as the starting position of the field in the bus, preceded by a 'z'.
In utils/phymkptr.hf several functions are defined to assign a pointer to the right space on the bus, depending on the dimension and type of level (if multi level). They can be used to assign a pointer to an address in a bus so the pointer can then get used in the routine as a "normal" array, for example:
Volet |
---|
MKPTR1D(zpmoins, pmoins, f) ! 1-D field from the permanent bus (f) MKPTR2D(ztmoins, tmoins, d) ! 2-D field from the dynamic bus (d) |
Where
'zpmoins'/'ztmoins' are the 1- resp. 2-D "arrays" in the routine,
'pmoins'/'tmoins' the specific position in the bus as declared in phyvar.hf and
'f'/'p' the name of the bus as received by the routine.
From the surface schemes
In the surface one passes the surface bus, its size, the list of variable and its size to the surface routine.
...