Skip to content

Commit b6dadf2

Browse files
author
Cansu Uluseker
committed
Updates to solve error
1 parent 80ecbb7 commit b6dadf2

19 files changed

+1920
-1776
lines changed

data.example/constants_test-scenario.nml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
river_attachment_efficiency = 0.01
5555
estuary_attachment_efficiency = 0.01
5656
estuary_tidal_m2 = 2.25
57-
estuary_ tidal_s2 = 0.62
57+
estuary_tidal_s2 = 0.62
5858
estuary_mean_depth_expa = 19.4
5959
estuary_mean_depth_expb = 1.46e-05
6060
estuary_width_expa = 12548
@@ -82,4 +82,4 @@
8282
urban_gardens = 150
8383
urban_parks = 250
8484
vertical_distribution = 50, 35, 15
85-
/
85+
/

fpm.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ source-dir = "src"
1717
main = "main.f90"
1818

1919
[build]
20-
link = ["netcdf", "netcdff"]
20+
link = ["netcdf", "netcdff"]
21+

src/BedSediment/BedSedimentModule.f90

Lines changed: 92 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -105,98 +105,113 @@ subroutine getMTCMatrix1(me, djdep, djres)
105105
!! Initialised `BedSediment` object, including all layers and included `FineSediment`
106106
!! objects
107107
function createBedSediment1(me, x, y, w) result(r)
108-
class(BedSediment) :: me !! Self-reference
109-
integer :: x !! x index of the containing water body
110-
integer :: y !! y index of the containing water body
111-
integer :: w !! w index of the containing water body
112-
type(Result) :: r !! Returned `Result` object
113-
type(BedSedimentLayer), allocatable :: bsl1 ! LOCAL object of type BedSedimentLayer, for implementation of polymorphism
114-
integer :: L ! LOCAL loop counter
115-
integer :: allst ! LOCAL array allocation status
116-
character(len=256) :: tr ! LOCAL error trace
117-
character(len=16), parameter :: ms = "Allocation error" ! LOCAL allocation error message
118-
type(ErrorInstance) :: err(1)
108+
class(BedSediment) :: me
109+
integer :: x, y, w
110+
type(Result) :: r
111+
type(BedSedimentLayer), allocatable :: bsl1
112+
integer :: L, allst
113+
character(len=256) :: tr
114+
character(len=16), parameter :: ms = "Allocation error"
115+
type(ErrorInstance) :: err(1)
116+
integer :: nx, ny
117+
logical :: inbounds
119118

120-
me%name = trim(ref('BedSediment', x, y, w))
121-
me%nSizeClasses = C%nSizeClassesSpm ! set number of size classes from global value
122-
me%nfComp = C%nFracCompsSpm ! set number of compositional fractions from global value
123-
tr = trim(me%name) // "%createBedSediment1" ! procedure name as trace
119+
me%name = trim(ref('BedSediment', x, y, w))
120+
! >>> FIX: set indices so later DATASET(x,y,...) lookups are valid
121+
me%x = x
122+
me%y = y
123+
! <<<
124124

125-
! Initialise Contaminant mass pools matrix
126-
allocate(me%m_contaminant(C%nSedimentLayers + 3), stat=allst)
127-
if (allst /= 0) then
128-
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
129-
call r%addError(err(1))
130-
call LOGR%toFile(errors=err)
131-
return
132-
end if
133-
do L = 1, C%nSedimentLayers + 3
134-
! Pass DATASET%nc and provide required arguments from DATASET
135-
r = me%m_contaminant(L)%create_from_data( &
136-
data=DATASET%nc, &
137-
compartment='sediment', &
138-
contaminantDensity=DATASET%contaminantDensity, &
139-
soilAttachmentEfficiency=DATASET%soilConstantAttachmentEfficiency, &
140-
riverAttachmentEfficiency=DATASET%riverAttachmentEfficiency, &
141-
estuaryAttachmentEfficiency=DATASET%estuaryAttachmentEfficiency, &
142-
k_diss_pristine=DATASET%contaminant_k_diss_pristine, &
143-
k_diss_transformed=DATASET%contaminant_k_diss_transformed, &
144-
k_transform_pristine=DATASET%contaminant_k_transform_pristine, &
145-
waterTemperature=DATASET%waterTemperature(1) & ! Use first timestep or adjust as needed
146-
)
147-
if (r%hasCriticalError()) then
148-
call LOGR%toFile(errors=r%getErrors())
125+
me%nSizeClasses = C%nSizeClassesSpm
126+
me%nfComp = C%nFracCompsSpm
127+
tr = trim(me%name) // "%createBedSediment1"
128+
129+
! Initialise Contaminant mass pools matrix
130+
allocate(me%m_contaminant(C%nSedimentLayers + 3), stat=allst)
131+
if (allst /= 0) then
132+
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
133+
call r%addError(err(1))
134+
call LOGR%toFile(errors=err)
149135
return
150136
end if
151-
if (L > 2 .and. allocated(DATASET%initialContaminantConcsSediment)) then
152-
me%m_contaminant(L)%c = DATASET%initialContaminantConcsSediment(me%x, me%y, :, :, :)
153-
if (allocated(DATASET%initialDissolvedConcsSediment)) then
154-
me%m_contaminant(L)%m_dissolved = DATASET%initialDissolvedConcsSediment(me%x, me%y)
137+
138+
do L = 1, C%nSedimentLayers + 3
139+
r = me%m_contaminant(L)%create_from_data( &
140+
compartment='sediment', & ! keep as used before; 'soil' also acceptable if your API expects it
141+
contaminantDensity=DATASET%contaminantDensity, &
142+
soilAttachmentEfficiency=DATASET%soilConstantAttachmentEfficiency, &
143+
riverAttachmentEfficiency=DATASET%riverAttachmentEfficiency, &
144+
estuaryAttachmentEfficiency=DATASET%estuaryAttachmentEfficiency, &
145+
k_diss_pristine=DATASET%contaminant_k_diss_pristine, &
146+
k_diss_transformed=DATASET%contaminant_k_diss_transformed, &
147+
k_transform_pristine=DATASET%contaminant_k_transform_pristine, &
148+
waterTemperature=real(DATASET%waterTemperature(1), dp) )
149+
if (r%hasCriticalError()) then
150+
call LOGR%toFile(errors=r%getErrors())
151+
return
155152
end if
156-
end if
157-
end do
158153

159-
allocate(me%colBedSedimentLayers(C%nSedimentLayers), stat=allst)
160-
if (allst /= 0) then
161-
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
162-
call r%addError(err(1))
163-
call LOGR%toFile(errors=err)
164-
return
165-
end if
166-
me%n_delta_sed = C%nSedimentLayers + 3
167-
allocate(me%delta_sed(C%nSedimentLayers + 3, C%nSedimentLayers + 3, me%nSizeClasses), stat=allst)
168-
if (allst /= 0) then
169-
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
170-
call r%addError(err(1))
171-
call LOGR%toFile(errors=err)
172-
return
173-
end if
174-
me%delta_sed = 0.0_dp
175-
allocate(me%delta_sed_csr(C%nSizeClassesSpm), stat=allst)
176-
if (allst /= 0) then
177-
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
178-
call r%addError(err(1))
179-
call LOGR%toFile(errors=err)
180-
return
181-
end if
154+
! Seed initial concentrations for actual sediment layers (L>2) if provided
155+
if (L > 2 .and. allocated(DATASET%initialContaminantConcsSediment)) then
156+
nx = size(DATASET%initialContaminantConcsSediment, 1)
157+
ny = size(DATASET%initialContaminantConcsSediment, 2)
158+
inbounds = (me%x>=1 .and. me%y>=1 .and. me%x<=nx .and. me%y<=ny)
159+
if (inbounds) then
160+
me%m_contaminant(L)%c = DATASET%initialContaminantConcsSediment(me%x, me%y, :, :, :)
161+
if (allocated(DATASET%initialDissolvedConcsSediment)) then
162+
me%m_contaminant(L)%m_dissolved = DATASET%initialDissolvedConcsSediment(me%x, me%y)
163+
end if
164+
else
165+
me%m_contaminant(L)%c = 0.0_dp
166+
me%m_contaminant(L)%m_dissolved = 0.0_dp
167+
end if
168+
end if
169+
end do
182170

183-
do L = 1, C%nSedimentLayers
184-
allocate(bsl1)
185-
call r%addErrors(.errors. bsl1%create(L))
186-
allocate(me%colBedSedimentLayers(L)%item, source=bsl1, stat=allst)
187-
deallocate(bsl1)
171+
allocate(me%colBedSedimentLayers(C%nSedimentLayers), stat=allst)
188172
if (allst /= 0) then
189173
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
190174
call r%addError(err(1))
191175
call LOGR%toFile(errors=err)
192176
return
193177
end if
194-
if (r%hasCriticalError()) then
195-
call r%addToTrace(tr)
178+
179+
me%n_delta_sed = C%nSedimentLayers + 3
180+
allocate(me%delta_sed(C%nSedimentLayers + 3, C%nSedimentLayers + 3, me%nSizeClasses), stat=allst)
181+
if (allst /= 0) then
182+
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
183+
call r%addError(err(1))
184+
call LOGR%toFile(errors=err)
185+
return
186+
end if
187+
me%delta_sed = 0.0_dp
188+
189+
allocate(me%delta_sed_csr(C%nSizeClassesSpm), stat=allst)
190+
if (allst /= 0) then
191+
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
192+
call r%addError(err(1))
193+
call LOGR%toFile(errors=err)
196194
return
197195
end if
198-
end do
199-
end function
196+
197+
do L = 1, C%nSedimentLayers
198+
allocate(bsl1)
199+
call r%addErrors(.errors. bsl1%create(L))
200+
allocate(me%colBedSedimentLayers(L)%item, source=bsl1, stat=allst)
201+
deallocate(bsl1)
202+
if (allst /= 0) then
203+
err(1) = ErrorInstance(code=1, message=ms, trace=[tr])
204+
call r%addError(err(1))
205+
call LOGR%toFile(errors=err)
206+
return
207+
end if
208+
if (r%hasCriticalError()) then
209+
call r%addToTrace(tr)
210+
return
211+
end if
212+
end do
213+
end function
214+
200215

201216
!> **Function purpose** <br>
202217
!! Deallocate all allocatable variables and call destroy methods for all

src/ConstantsDefaultsModule.f90

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,31 @@
22
module ConstantsDefaultsModule
33
implicit none
44

5+
integer, private, parameter :: dp = selected_real_kind(15, 307)
6+
57
! Defaults for constants
6-
real, parameter :: defaultSoilAttachmentEfficiency = 0.0
7-
real, parameter :: defaultRiverAttachmentEfficiency = 0.0 ! Attachment efficiency for NM to SPM in rivers
8-
real, parameter :: defaultSoilDarcyVelocity = 9e-6 ! [m/s] Tufenkji et al, 2004: https://doi.org/10.1021/es034049r
9-
real, parameter :: default_k_diss_pristine = 0.0 ! Dissolution rate for pristine contaminant [s-1]
10-
real, parameter :: default_k_diss_transformed = 0.0 ! Dissolution rate for transformed contaminant [s-1]
11-
real, parameter :: default_k_transform_pristine = 0.0 ! Transformation rate for pristine contaminant [s-1]
12-
real, parameter :: default_rho_contaminant = 1000.0 ! Density of contaminant [kg/m3]
13-
real, parameter :: defaultShearRate = 10.0 ! Arvidsson et al, 2009: https://doi.org/10.1080/10807039.2011.538639
14-
real, parameter :: defaultMinWaterTemperature = 4.0 ! Thames River
15-
real, parameter :: defaultMaxWaterTemperature = 21.0 ! Thames River
16-
integer, parameter :: defaultMinWaterTemperatureDayOfYear = 32 ! Thames River
17-
real, parameter :: defaultSedimentTransport_a = 2.0e-9
18-
real, parameter :: defaultSedimentTransport_b = 0.0
19-
real, parameter :: defaultSedimentTransport_c = 0.2
20-
real, parameter :: defaultSedimentEnrichment_k = 1.0
21-
real, parameter :: defaultSedimentEnrichment_a = 0.0
22-
real, parameter :: defaultSlope = 0.0005
23-
real, parameter :: defaultDepositionAlpha = 38.1 ! Zhiyao et al, 2008: https://doi.org/10.1016/S1674-2370(15)30017-X
24-
real, parameter :: defaultDepositionBeta = 0.93 ! Zhiyao et al, 2008: https://doi.org/10.1016/S1674-2370(15)30017-X
25-
real, parameter :: defaultBankErosionAlpha = 1.0e-9 ! [kg/m5] Loosely based on Lazar et al, 2010: https://doi.org/10.1016/j.scitotenv.2010.02.030
26-
real, parameter :: defaultBankErosionBeta = 1.0 ! [-] Loosely based on Lazar et al, 2010: https://doi.org/10.1016/j.scitotenv.2010.02.030
8+
real(dp), parameter :: defaultSoilAttachmentEfficiency = 0.0_dp
9+
real(dp), parameter :: defaultRiverAttachmentEfficiency = 0.0_dp ! Attachment efficiency for NM to SPM in rivers
10+
real(dp), parameter :: defaultEstuaryAttachmentEfficiency = 0.0_dp
11+
real(dp), parameter :: defaultSoilDarcyVelocity = 9.0e-6_dp ! [m/s] Tufenkji et al, 2004: https://doi.org/10.1021/es034049r
12+
real(dp), parameter :: default_k_diss_pristine = 0.0_dp ! Dissolution rate for pristine contaminant [s-1]
13+
real(dp), parameter :: default_k_diss_transformed = 0.0_dp ! Dissolution rate for transformed contaminant [s-1]
14+
real(dp), parameter :: default_k_transform_pristine = 0.0_dp ! Transformation rate for pristine contaminant [s-1]
15+
real(dp), parameter :: default_rho_contaminant = 1000.0_dp ! Density of contaminant [kg/m3]
16+
real(dp), parameter :: defaultShearRate = 10.0_dp ! Arvidsson et al, 2009: https://doi.org/10.1080/10807039.2011.538639
17+
real(dp), parameter :: defaultMinWaterTemperature = 4.0_dp ! Thames River
18+
real(dp), parameter :: defaultMaxWaterTemperature = 21.0_dp ! Thames River
19+
integer, parameter :: defaultMinWaterTemperatureDayOfYear = 32 ! Thames River
20+
real(dp), parameter :: defaultSedimentTransport_a = 2.0e-9_dp
21+
real(dp), parameter :: defaultSedimentTransport_b = 0.0_dp
22+
real(dp), parameter :: defaultSedimentTransport_c = 0.2_dp
23+
real(dp), parameter :: defaultSedimentEnrichment_k = 1.0_dp
24+
real(dp), parameter :: defaultSedimentEnrichment_a = 0.0_dp
25+
real(dp), parameter :: defaultSlope = 0.0005_dp
26+
real(dp), parameter :: defaultDepositionAlpha = 38.1_dp ! Zhiyao et al, 2008: https://doi.org/10.1016/S1674-2370(15)30017-X
27+
real(dp), parameter :: defaultDepositionBeta = 0.93_dp ! Zhiyao et al, 2008: https://doi.org/10.1016/S1674-2370(15)30017-X
28+
real(dp), parameter :: defaultBankErosionAlpha = 1.0e-9_dp ! [kg/m5] Loosely based on Lazar et al, 2010: https://doi.org/10.1016/j.scitotenv.2010.02.030
29+
real(dp), parameter :: defaultBankErosionBeta = 1.0_dp ! [-] Loosely based on Lazar et al, 2010: https://doi.org/10.1016/j.scitotenv.2010.02.030
2730
! Default for contaminant form distribution (pristine, transformed, dissolved)
28-
real, parameter :: defaultContaminantFormDistribution(3) = [1.0, 0.0, 0.0] ! All in pristine form
31+
real(dp), parameter :: defaultContaminantFormDistribution(3) = [1.0_dp, 0.0_dp, 0.0_dp] ! All in pristine form
2932
end module

0 commit comments

Comments
 (0)