Commit 527b9319 authored by Jorn Bruggeman's avatar Jorn Bruggeman
Browse files

split fabm module; added fabm_ prefix for public entities

parent 16691f58
......@@ -2,29 +2,29 @@
! It is automatically generated by ..\util\standard_variables\parse_standard_variables.py from ..\util\standard_variables\variables.yaml.
! Edit variables.yaml instead and re-run parse_standard_variables.py.
! Interior variables
type (type_bulk_standard_variable) :: alkalinity_expressed_as_mole_equivalent
type (type_bulk_standard_variable) :: attenuation_coefficient_of_photosynthetic_radiative_flux
type (type_bulk_standard_variable) :: attenuation_coefficient_of_shortwave_flux
type (type_bulk_standard_variable) :: cell_thickness
type (type_bulk_standard_variable) :: density
type (type_bulk_standard_variable) :: depth
type (type_bulk_standard_variable) :: downwelling_photosynthetic_radiative_flux
type (type_bulk_standard_variable) :: downwelling_shortwave_flux
type (type_bulk_standard_variable) :: fractional_saturation_of_oxygen
type (type_bulk_standard_variable) :: mass_concentration_of_suspended_matter
type (type_bulk_standard_variable) :: mole_concentration_of_ammonium
type (type_bulk_standard_variable) :: mole_concentration_of_carbonate_expressed_as_carbon
type (type_bulk_standard_variable) :: mole_concentration_of_dissolved_inorganic_carbon
type (type_bulk_standard_variable) :: mole_concentration_of_dissolved_iron
type (type_bulk_standard_variable) :: mole_concentration_of_nitrate
type (type_bulk_standard_variable) :: mole_concentration_of_phosphate
type (type_bulk_standard_variable) :: mole_concentration_of_silicate
type (type_bulk_standard_variable) :: net_rate_of_absorption_of_shortwave_energy_in_layer
type (type_bulk_standard_variable) :: ph_reported_on_total_scale
type (type_bulk_standard_variable) :: practical_salinity
type (type_bulk_standard_variable) :: pressure
type (type_bulk_standard_variable) :: secchi_depth
type (type_bulk_standard_variable) :: temperature
type (type_interior_standard_variable) :: alkalinity_expressed_as_mole_equivalent
type (type_interior_standard_variable) :: attenuation_coefficient_of_photosynthetic_radiative_flux
type (type_interior_standard_variable) :: attenuation_coefficient_of_shortwave_flux
type (type_interior_standard_variable) :: cell_thickness
type (type_interior_standard_variable) :: density
type (type_interior_standard_variable) :: depth
type (type_interior_standard_variable) :: downwelling_photosynthetic_radiative_flux
type (type_interior_standard_variable) :: downwelling_shortwave_flux
type (type_interior_standard_variable) :: fractional_saturation_of_oxygen
type (type_interior_standard_variable) :: mass_concentration_of_suspended_matter
type (type_interior_standard_variable) :: mole_concentration_of_ammonium
type (type_interior_standard_variable) :: mole_concentration_of_carbonate_expressed_as_carbon
type (type_interior_standard_variable) :: mole_concentration_of_dissolved_inorganic_carbon
type (type_interior_standard_variable) :: mole_concentration_of_dissolved_iron
type (type_interior_standard_variable) :: mole_concentration_of_nitrate
type (type_interior_standard_variable) :: mole_concentration_of_phosphate
type (type_interior_standard_variable) :: mole_concentration_of_silicate
type (type_interior_standard_variable) :: net_rate_of_absorption_of_shortwave_energy_in_layer
type (type_interior_standard_variable) :: ph_reported_on_total_scale
type (type_interior_standard_variable) :: practical_salinity
type (type_interior_standard_variable) :: pressure
type (type_interior_standard_variable) :: secchi_depth
type (type_interior_standard_variable) :: temperature
! Horizontal variables
type (type_horizontal_standard_variable) :: bottom_depth
......@@ -49,9 +49,9 @@ type (type_horizontal_standard_variable) :: wind_speed
type (type_global_standard_variable) :: number_of_days_since_start_of_the_year
! Conserved variables
type (type_bulk_standard_variable) :: total_carbon
type (type_bulk_standard_variable) :: total_iron
type (type_bulk_standard_variable) :: total_nitrogen
type (type_bulk_standard_variable) :: total_phosphorus
type (type_bulk_standard_variable) :: total_silicate
type (type_interior_standard_variable) :: total_carbon
type (type_interior_standard_variable) :: total_iron
type (type_interior_standard_variable) :: total_nitrogen
type (type_interior_standard_variable) :: total_phosphorus
type (type_interior_standard_variable) :: total_silicate
......@@ -229,6 +229,9 @@ add_library(fabm
${CMAKE_CURRENT_LIST_DIR}/fabm_schedule.F90
${CMAKE_CURRENT_LIST_DIR}/fabm.F90
${CMAKE_CURRENT_LIST_DIR}/fabm_config.F90
${CMAKE_CURRENT_LIST_DIR}/fabm_debug.F90
${CMAKE_CURRENT_LIST_DIR}/fabm_cache.F90
${CMAKE_CURRENT_LIST_DIR}/fabm_v0_compatibility.F90
)
add_dependencies(fabm yaml)
......
......@@ -6,7 +6,7 @@ module fabm_python
!DIR$ ATTRIBUTES DLLEXPORT :: STATE_VARIABLE,DIAGNOSTIC_VARIABLE,CONSERVED_QUANTITY
use fabm, only: type_fabm_model, type_external_variable, fabm_get_version, status_check_ready_done
use fabm, only: type_fabm_model, type_fabm_variable, fabm_get_version, status_start_done
use fabm_config
use fabm_types, only:rk => rke,attribute_length,type_model_list_node,type_base_model, &
factory,type_link,type_link_list,type_internal_variable
......@@ -222,8 +222,8 @@ contains
integer(c_int), intent(in), value :: category, index, length
character(kind=c_char), intent(out), dimension(length) :: name, units, long_name, path
type (type_model_wrapper), pointer :: model
class (type_external_variable), pointer :: variable
type (type_model_wrapper), pointer :: model
class (type_fabm_variable), pointer :: variable
call c_f_pointer(pmodel, model)
......@@ -439,7 +439,7 @@ contains
real(c_double), pointer :: dy_(:)
call c_f_pointer(pmodel, model)
if (model%p%status < status_check_ready_done) then
if (model%p%status < status_start_done) then
call fatal_error('get_rates', 'start has not been called yet.')
return
end if
......@@ -484,7 +484,7 @@ contains
logical :: repair, interior_valid, surface_valid, bottom_valid
call c_f_pointer(pmodel, model)
if (model%p%status < status_check_ready_done) then
if (model%p%status < status_start_done) then
call fatal_error('check_state', 'start has not been called yet.')
return
end if
......@@ -513,7 +513,7 @@ contains
logical :: surface, bottom
call c_f_pointer(pmodel, model)
if (model%p%status < status_check_ready_done) then
if (model%p%status < status_start_done) then
call fatal_error('integrate', 'start has not been called yet.')
return
end if
......
This diff is collapsed.
......@@ -463,13 +463,13 @@ module fabm_builtin_models
end subroutine weighted_sum_reindex
logical function merge_component(component_link, weight, target_variable, offset, log_unit)
type (type_link), intent(in) :: component_link
type (type_link), intent(inout) :: component_link
type (type_internal_variable), intent(inout), target :: target_variable
real(rk), intent(in) :: weight
real(rk), intent(inout) :: offset
integer, optional, intent(in) :: log_unit
type (type_internal_variable),pointer :: component_variable
type (type_internal_variable), pointer :: component_variable
component_variable => component_link%target
......
This diff is collapsed.
......@@ -6,7 +6,7 @@ module fabm_config
use fabm_properties, only: type_property_dictionary, type_property, type_set
use fabm_driver
use fabm_schedule
use fabm, only: type_fabm_model, fabm_initialize_library, fabm_log, type_model
use fabm, only: type_fabm_model, fabm_initialize_library, fabm_log
use yaml_types
use yaml, yaml_parse=>parse, yaml_error_length=>error_length
......@@ -16,9 +16,7 @@ module fabm_config
private
public fabm_create_model
! For backward compatibility (20191115):
public fabm_create_model_from_yaml_file
public fabm_configure_model
contains
......@@ -34,22 +32,11 @@ contains
initialize_ = .true.
if (present(initialize)) initialize_ = initialize
allocate(model)
call configure(model, path, do_not_initialize=.not. initialize_, parameters=parameters, unit=unit)
call fabm_configure_model(model, path, do_not_initialize=.not. initialize_, parameters=parameters, unit=unit)
end function
! For backward compatibility (20191115):
subroutine fabm_create_model_from_yaml_file(model, path, do_not_initialize, parameters, unit)
type (type_model), intent(out) :: model
character(len=*), optional, intent(in) :: path
logical, optional, intent(in) :: do_not_initialize
type (type_property_dictionary), optional, intent(in) :: parameters
integer, optional, intent(in) :: unit
call configure(model, path, do_not_initialize, parameters, unit)
end subroutine
subroutine configure(model, path, do_not_initialize, parameters, unit)
class (type_model), intent(inout) :: model
subroutine fabm_configure_model(model, path, do_not_initialize, parameters, unit)
class (type_fabm_model), intent(inout) :: model
character(len=*), optional, intent(in) :: path
logical, optional, intent(in) :: do_not_initialize
type (type_property_dictionary), optional, intent(in) :: parameters
......@@ -94,10 +81,10 @@ contains
&at the root (non-indented) level, not a single value. Are you missing a trailing colon?')
end select
end subroutine configure
end subroutine fabm_configure_model
subroutine create_model_tree_from_dictionary(model, mapping, do_not_initialize, parameters)
class (type_model), intent(inout) :: model
class (type_fabm_model), intent(inout) :: model
class (type_dictionary), intent(in) :: mapping
logical, optional, intent(in) :: do_not_initialize
type (type_property_dictionary), optional, intent(in) :: parameters
......
#include "fabm_driver.h"
#include "fabm_private.h"
module fabm_debug
use fabm_driver
use fabm_types, only: rke
implicit none
private
public check_interior_location, check_horizontal_location, check_vertical_location
public check_extents_1d, check_extents_2d, check_extents_3d
contains
subroutine check_interior_location(domain_size _POSTARG_INTERIOR_IN_, routine)
integer, intent(in) :: domain_size(_FABM_DIMENSION_COUNT_)
_DECLARE_ARGUMENTS_INTERIOR_IN_
character(len=*), intent(in) :: routine
#ifdef _FABM_VECTORIZED_DIMENSION_INDEX_
call check_loop(_START_, _STOP_, domain_size(_FABM_VECTORIZED_DIMENSION_INDEX_), routine)
#endif
#if _FABM_DIMENSION_COUNT_>0&&_FABM_VECTORIZED_DIMENSION_INDEX_!=1
call check_index(i__, domain_size(1), routine, 'i')
#endif
#if _FABM_DIMENSION_COUNT_>1&&_FABM_VECTORIZED_DIMENSION_INDEX_!=2
call check_index(j__, domain_size(2), routine, 'j')
#endif
#if _FABM_DIMENSION_COUNT_>2&&_FABM_VECTORIZED_DIMENSION_INDEX_!=3
call check_index(k__, domain_size(3), routine, 'k')
#endif
end subroutine check_interior_location
subroutine check_horizontal_location(domain_size _POSTARG_HORIZONTAL_IN_, routine)
integer, intent(in) :: domain_size(_FABM_DIMENSION_COUNT_)
_DECLARE_ARGUMENTS_HORIZONTAL_IN_
character(len=*), intent(in) :: routine
#ifdef _HORIZONTAL_IS_VECTORIZED_
call check_loop(_START_, _STOP_, domain_size(_FABM_VECTORIZED_DIMENSION_INDEX_), routine)
#endif
#if _FABM_DIMENSION_COUNT_>0&&_FABM_VECTORIZED_DIMENSION_INDEX_!=1&&_FABM_DEPTH_DIMENSION_INDEX_!=1
call check_index(i__, domain_size(1), routine, 'i')
#endif
#if _FABM_DIMENSION_COUNT_>1&&_FABM_VECTORIZED_DIMENSION_INDEX_!=2&&_FABM_DEPTH_DIMENSION_INDEX_!=2
call check_index(j__, domain_size(2), routine, 'j')
#endif
#if _FABM_DIMENSION_COUNT_>2&&_FABM_VECTORIZED_DIMENSION_INDEX_!=3&&_FABM_DEPTH_DIMENSION_INDEX_!=3
call check_index(k__, domain_size(3), routine, 'k')
#endif
end subroutine check_horizontal_location
subroutine check_vertical_location(domain_size _POSTARG_VERTICAL_IN_, routine)
integer, intent(in) :: domain_size(_FABM_DIMENSION_COUNT_)
_DECLARE_ARGUMENTS_VERTICAL_IN_
character(len=*), intent(in) :: routine
#ifdef _FABM_DEPTH_DIMENSION_INDEX_
call check_loop(_VERTICAL_START_, _VERTICAL_STOP_, domain_size(_FABM_DEPTH_DIMENSION_INDEX_), routine)
#endif
#if _FABM_DIMENSION_COUNT_>0&&_FABM_DEPTH_DIMENSION_INDEX_!=1
call check_index(i__, domain_size(1), routine, 'i')
#endif
#if _FABM_DIMENSION_COUNT_>1&&_FABM_DEPTH_DIMENSION_INDEX_!=2
call check_index(j__, domain_size(2), routine, 'j')
#endif
#if _FABM_DIMENSION_COUNT_>2&&_FABM_DEPTH_DIMENSION_INDEX_!=3
call check_index(k__, domain_size(3), routine, 'k')
#endif
end subroutine check_vertical_location
subroutine check_extents_1d(array, required_size1, routine, array_name, shape_description)
real(rke), intent(in) :: array(:)
integer, intent(in) :: required_size1
character(len=*), intent(in) :: routine, array_name, shape_description
character(len=8) :: actual, required
if (size(array,1) /= required_size1) then
write (actual, '(i0)') size(array, 1)
write (required,'(i0)') required_size1
call fatal_error(routine, 'shape of argument ' // trim(array_name) // ' is (' // trim(actual) // ') but should be (' // trim(required) // ') = ' // trim(shape_description))
end if
end subroutine check_extents_1d
subroutine check_extents_2d(array, required_size1, required_size2, routine, array_name, shape_description)
real(rke), intent(in) :: array(:,:)
integer, intent(in) :: required_size1, required_size2
character(len=*), intent(in) :: routine, array_name, shape_description
character(len=17) :: actual, required
if (size(array,1) /= required_size1 .or. size(array,2) /= required_size2) then
write (actual, '(i0,a,i0)') size(array,1), ',', size(array,2)
write (required,'(i0,a,i0)') required_size1, ',', required_size2
call fatal_error(routine, 'shape of argument ' // trim(array_name) // ' is (' // trim(actual) // ') but should be (' // trim(required) // ') = ' // trim(shape_description))
end if
end subroutine check_extents_2d
subroutine check_extents_3d(array, required_size1, required_size2, required_size3, routine, array_name, shape_description)
real(rke), intent(in) :: array(:,:,:)
integer, intent(in) :: required_size1, required_size2, required_size3
character(len=*),intent(in) :: routine, array_name, shape_description
character(len=26) :: actual, required
if (size(array,1) /= required_size1 .or. size(array,2) /= required_size2 .or. size(array,3) /= required_size3) then
write (actual, '(i0,a,i0,a,i0)') size(array,1), ',', size(array,2), ',', size(array,3)
write (required,'(i0,a,i0,a,i0)') required_size1, ',', required_size2, ',', required_size3
call fatal_error(routine, 'shape of argument ' // trim(array_name) // ' is (' // trim(actual) // ') but should be (' // trim(required) // ') = ' // trim(shape_description))
end if
end subroutine check_extents_3d
subroutine check_loop(istart, istop, imax, routine)
integer, intent(in) :: istart, istop, imax
character(len=*), intent(in) :: routine
character(len=8) :: str1, str2
if (istart < 1) then
write (str1,'(i0)') istart
call fatal_error(routine, 'Loop start index ' // trim(str1) // ' is non-positive.')
end if
if (istop > imax) then
write (str1,'(i0)') istop
write (str2,'(i0)') imax
call fatal_error(routine, 'Loop stop index ' // trim(str1) // ' exceeds size of vectorized dimension (' // trim(str2) // ').')
end if
if (istart > istop) then
write (str1,'(i0)') istart
write (str2,'(i0)') istop
call fatal_error(routine, 'Loop start index ' // trim(str1) // ' exceeds stop index ' // trim(str2) // '.')
end if
end subroutine check_loop
subroutine check_index(i, i_max, routine, name)
integer, intent(in) :: i, i_max
character(len=*), intent(in) :: routine, name
character(len=8) :: str1, str2
if (i < 1) then
write (str1,'(i0)') i
call fatal_error(routine, 'Index ' // name // ' = ' // trim(str1) // ' is non-positive.')
end if
if (i > i_max) then
write (str1,'(i0)') i
write (str2,'(i0)') i_max
call fatal_error(routine, 'Index ' // name // ' = ' // trim(str1) // ' exceeds size of associated dimension (' // trim(str2) // ').')
end if
end subroutine check_index
end module
\ No newline at end of file
......@@ -1694,11 +1694,11 @@ logical function is_source_compatible(operation, new_source)
end select
end function is_source_compatible
function variable_register_add(self, variable, share_constants) result(index)
function variable_register_add(self, variable, share_constants) result(i)
type (type_variable_register), intent(inout) :: self
type (type_internal_variable), target :: variable
logical, intent(in) :: share_constants
integer :: index
integer :: i
_ASSERT_(.not. self%frozen, 'variable_register_add', 'Cannot add '//trim(variable%name)//'; register has been frozen.')
select case (variable%domain)
......@@ -1720,15 +1720,15 @@ contains
if (share_constants .and. variable%source == source_constant) then
! This is a constant. See if there is already another constant with the same value in the register.
! If there is, reuse that entry instead of creating a new one.
index = 0
i = 0
node => list%first
do while (associated(node))
index = index + 1
i = i + 1
if (node%target%source == source_constant .and. node%target%prefill_value == variable%prefill_value) return
node => node%next
end do
end if
call list%append(variable, index=index)
call list%append(variable, index=i)
end subroutine
end function variable_register_add
......
......@@ -6,7 +6,7 @@
! variable (derived type) that has all standard identities as its members. This can then be used as
! standard_variables%temperature, standard_variables%wind_speed, etc.
! For a list of all supported variables, please see:
! http://sourceforge.net/p/fabm/wiki/List_of_standard_variables
! https://github.com/fabm-model/fabm/wiki/List-of-standard-variables
!
! Biogeochemical models can use these "identity" objects in two ways. First, they can access the value
! of the corresponding variable by registering them as dependency. To do so, call register_dependency
......@@ -32,7 +32,7 @@ module fabm_standard_variables
private
public type_base_standard_variable, type_bulk_standard_variable, type_horizontal_standard_variable, type_global_standard_variable
public type_base_standard_variable, type_interior_standard_variable, type_horizontal_standard_variable, type_global_standard_variable
public type_standard_variable_node, type_standard_variable_set
public standard_variables, initialize_standard_variables
......@@ -44,7 +44,7 @@ module fabm_standard_variables
character(len=256) :: name = '' ! Name
character(len=64) :: units = '' ! Units
character(len=512) :: cf_names = '' ! Comma-separated list of standard names defined in the NetCDF CF convention
! (http://cf-pcmdi.llnl.gov/documents/cf-standard-names/)
! (http://cfconventions.org/standard-names.html)
logical :: aggregate_variable = .false. ! Whether biogeochemical models can contribute (add to) this variable.
! If .true., this variable is always available with a default value of 0.
logical :: conserved = .false. ! Whether this variable shoudl be included in lists of conserved quantities.
......@@ -53,7 +53,7 @@ module fabm_standard_variables
procedure :: compare => standard_variable_compare
end type
type,extends(type_base_standard_variable) :: type_bulk_standard_variable
type,extends(type_base_standard_variable) :: type_interior_standard_variable
end type
type,extends(type_base_standard_variable) :: type_horizontal_standard_variable
......@@ -63,8 +63,8 @@ module fabm_standard_variables
end type
type type_standard_variable_node
class (type_base_standard_variable),pointer :: p => null()
type (type_standard_variable_node), pointer :: next => null()
class (type_base_standard_variable), pointer :: p => null()
type (type_standard_variable_node), pointer :: next => null()
end type
type type_standard_variable_set
......@@ -72,7 +72,7 @@ module fabm_standard_variables
contains
procedure :: contains_variable => standard_variable_set_contains_variable
procedure :: contains_name => standard_variable_set_contains_name
generic :: contains => contains_variable,contains_name
generic :: contains => contains_variable, contains_name
procedure :: add => standard_variable_set_add
procedure :: update => standard_variable_set_update
procedure :: finalize => standard_variable_set_finalize
......@@ -92,44 +92,44 @@ contains
end subroutine
logical function standard_variable_is_null(variable)
class (type_base_standard_variable),intent(in) :: variable
standard_variable_is_null = (variable%name==''.and. variable%units=='')
class (type_base_standard_variable), intent(in) :: variable
standard_variable_is_null = (variable%name == '' .and. variable%units == '')
end function
logical function standard_variable_compare(variable1,variable2)
class (type_base_standard_variable),intent(in) :: variable1,variable2
logical function standard_variable_compare(variable1, variable2)
class (type_base_standard_variable), intent(in) :: variable1, variable2
standard_variable_compare = .false.
! First test whether the types match.
select type (variable1)
class is (type_bulk_standard_variable)
select type (variable2)
class is (type_bulk_standard_variable)
standard_variable_compare = .true.
end select
class is (type_horizontal_standard_variable)
select type (variable2)
class is (type_horizontal_standard_variable)
standard_variable_compare = .true.
end select
class is (type_global_standard_variable)
select type (variable2)
class is (type_global_standard_variable)
standard_variable_compare = .true.
end select
class is (type_interior_standard_variable)
select type (variable2)
class is (type_interior_standard_variable)
standard_variable_compare = .true.
end select
class is (type_horizontal_standard_variable)
select type (variable2)
class is (type_horizontal_standard_variable)
standard_variable_compare = .true.
end select
class is (type_global_standard_variable)
select type (variable2)
class is (type_global_standard_variable)
standard_variable_compare = .true.
end select
end select
! If types do not match, the standard variables are not equal - we're done.
if (.not.standard_variable_compare) return
if (.not. standard_variable_compare) return
! Compare the metadata of the standard variables.
standard_variable_compare = (variable1%name ==''.or.variable2%name ==''.or.variable1%name ==variable2%name ) &
.and. (variable1%units==''.or.variable2%units==''.or.variable1%units==variable2%units)
standard_variable_compare = (variable1%name == '' .or. variable2%name == '' .or. variable1%name == variable2%name ) &
.and. (variable1%units == '' .or. variable2%units == '' .or. variable1%units == variable2%units)
end function standard_variable_compare
logical function standard_variable_set_contains_variable(self,standard_variable)
class (type_standard_variable_set), intent(in) :: self
class (type_base_standard_variable),intent(in) :: standard_variable
logical function standard_variable_set_contains_variable(self, standard_variable)
class (type_standard_variable_set), intent(in) :: self
class (type_base_standard_variable), intent(in) :: standard_variable
type (type_standard_variable_node), pointer :: node
......@@ -142,30 +142,30 @@ contains
standard_variable_set_contains_variable = .false.
end function standard_variable_set_contains_variable
logical function standard_variable_set_contains_name(self,name)
class (type_standard_variable_set),intent(in) :: self
character(len=*), intent(in) :: name
logical function standard_variable_set_contains_name(self, name)
class (type_standard_variable_set), intent(in) :: self
character(len=*), intent(in) :: name
type (type_standard_variable_node), pointer :: node
standard_variable_set_contains_name = .true.
node => self%first
do while (associated(node))
if (node%p%name==name) return
if (node%p%name == name) return
node => node%next
end do
standard_variable_set_contains_name = .false.
end function standard_variable_set_contains_name
subroutine standard_variable_set_add(self,standard_variable)
class (type_standard_variable_set), intent(inout) :: self
class (type_base_standard_variable),intent(in) :: standard_variable
subroutine standard_variable_set_add(self, standard_variable)
class (type_standard_variable_set), intent(inout) :: self
class (type_base_standard_variable), intent(in) :: standard_variable
type (type_standard_variable_node), pointer :: node
if (self%contains(standard_variable)) return
if (.not.associated(self%first)) then
if (.not. associated(self%first)) then
allocate(self%first)
node => self%first
else
......@@ -176,12 +176,12 @@ contains
allocate(node%next)
node => node%next
end if
allocate(node%p,source=standard_variable)
allocate(node%p, source=standard_variable)
end subroutine standard_variable_set_add
subroutine standard_variable_set_update(self,other)
class (type_standard_variable_set),intent(inout) :: self
class (type_standard_variable_set),intent(in) :: other
subroutine standard_variable_set_update(self, other)
class (type_standard_variable_set), intent(inout) :: self
class (type_standard_variable_set), intent(in) :: other
type (type_standard_variable_node), pointer :: node
......@@ -193,9 +193,9 @@ contains