1+ /*
2+ * GNU GPL v3 License
3+ *
4+ * Copyright 2019 Niccolo` Tubini
5+ *
6+ * This program is free software: you can redistribute it and/or modify
7+ * it under the terms of the GNU General Public License as published by
8+ * the Free Software Foundation, either version 3 of the License, or
9+ * (at your option) any later version.
10+ *
11+ * This program is distributed in the hope that it will be useful,
12+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+ * GNU General Public License for more details.
15+ *
16+ * You should have received a copy of the GNU General Public License
17+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
18+ */
19+
20+
21+ /**
22+ *
23+ */
24+ package it .geoframe .blogspot .closureequation .closureequation ;
25+
26+
27+
28+ /**
29+ * @author Niccolo` Tubini
30+ *
31+ * Van Genuchten SWRC
32+ */
33+ public class SWRCVanGenuchtenDallAmico extends SoilWaterRetentionCurve {
34+
35+ private double m ;
36+ private double meltingTemperature ;
37+ private double tmp ;
38+ private double psiT ;
39+
40+
41+ @ Override
42+ public double f (double x , double y , int id ) {
43+
44+ m = 1 -1 /super .parameters .par1 [id ];
45+ meltingTemperature = 273.15 + 9.81 *273.15 /super .parameters .latentHeatFusion *x ;
46+ if (y >meltingTemperature ) {
47+ if (x >=0 ) {
48+ return super .parameters .thetaS [id ];
49+ } else {
50+ return super .parameters .thetaR [id ] + (super .parameters .thetaS [id ]-super .parameters .thetaR [id ])
51+ *Math .pow ( 1.0 + Math .pow (Math .abs (super .parameters .par2 [id ]*x ), super .parameters .par1 [id ]), -m );
52+ }
53+ } else {
54+ psiT = x + super .parameters .latentHeatFusion /(9.81 *meltingTemperature )*(y -meltingTemperature );
55+ if (psiT >=0 ) {
56+ return super .parameters .thetaS [id ];
57+ } else {
58+ return super .parameters .thetaR [id ] + (super .parameters .thetaS [id ]-super .parameters .thetaR [id ])
59+ *Math .pow ( 1.0 + Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ), super .parameters .par1 [id ]), -m );
60+ }
61+ }
62+
63+ }
64+
65+
66+
67+ @ Override
68+ public double df (double x , double y , int id ) {
69+
70+ m = 1 -1 /super .parameters .par1 [id ];
71+ meltingTemperature = 273.15 + 9.81 *273.15 /super .parameters .latentHeatFusion *x ;
72+ if (y >meltingTemperature ) {
73+ if (x >=0 ) {
74+ return 0.0 ;
75+ } else {
76+ return 0.0 ;
77+ }
78+ } else {
79+ psiT = x +super .parameters .latentHeatFusion /(9.81 *meltingTemperature )*(y -meltingTemperature );
80+ tmp = super .parameters .latentHeatFusion /(9.81 *meltingTemperature );
81+ if (psiT >=0 ) {
82+ return 0.0 ;
83+ } else {
84+ // return (super.parameters.thetaS[id]-super.parameters.thetaR[id])*m*super.parameters.par1[id]*super.parameters.par2[id]*tmp
85+ // *Math.pow( 1.0 + Math.pow(Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))), super.parameters.par1[id]), -m-1)
86+ // *Math.pow(Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))), super.parameters.par1[id]-1);
87+ return (super .parameters .thetaS [id ]-super .parameters .thetaR [id ])*m *super .parameters .par1 [id ]*super .parameters .par2 [id ]*tmp
88+ *Math .pow ( 1.0 + Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ), super .parameters .par1 [id ]), -m -1 )
89+ *Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ), super .parameters .par1 [id ]-1 );
90+ }
91+ }
92+
93+ }
94+
95+
96+ @ Override
97+ public double ddf (double x , double y , int id ) {
98+
99+ m = 1 -1 /super .parameters .par1 [id ];
100+ meltingTemperature = 273.15 + 9.81 *273.15 /super .parameters .latentHeatFusion *x ;
101+ if (y >meltingTemperature ) {
102+ if (x >0 ) {
103+ return 0.0 ;
104+ } else {
105+ return 0.0 ;
106+ }
107+ } else {
108+ psiT = x +super .parameters .latentHeatFusion /(9.81 *meltingTemperature )*(y -meltingTemperature );
109+ tmp = super .parameters .latentHeatFusion /(9.81 *meltingTemperature );
110+ if (psiT >=0 ) {
111+ return 0.0 ;
112+ } else {
113+ // return (super.parameters.thetaS[id]-super.parameters.thetaR[id])*m*super.parameters.par1[id] * Math.pow( Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))), super.parameters.par1[id] ) * Math.pow(1+Math.pow(Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))),super.parameters.par1[id]), -m-2)*
114+ // ( super.parameters.par1[id]*Math.pow(super.parameters.par2[id]*tmp,2)*(m+1) * Math.pow(Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))),super.parameters.par1[id]-2) -
115+ // (super.parameters.par1[id]-1)*Math.pow(super.parameters.par2[id]*tmp,2) * Math.pow(Math.abs(super.parameters.par2[id]*tmp*(y-meltingTemperature)),-2) * (1+Math.pow(Math.abs(super.parameters.par2[id]*(x+tmp*(y-meltingTemperature))),super.parameters.par1[id])) );
116+ return (super .parameters .thetaS [id ]-super .parameters .thetaR [id ])*m *super .parameters .par1 [id ] * Math .pow ( Math .abs (super .parameters .par2 [id ]*psiT ), super .parameters .par1 [id ] ) * Math .pow (1 +Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ),super .parameters .par1 [id ]), -m -2 ) *
117+ ( super .parameters .par1 [id ]*Math .pow (super .parameters .par2 [id ]*tmp ,2 )*(m +1 ) * Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ),super .parameters .par1 [id ]-2 ) -
118+ (super .parameters .par1 [id ]-1 )*Math .pow (super .parameters .par2 [id ]*tmp ,2 ) * Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ),-2 ) * (1 +Math .pow (Math .abs (super .parameters .par2 [id ]*psiT ),super .parameters .par1 [id ])) );
119+ }
120+ }
121+
122+ }
123+
124+
125+
126+ @ Override
127+ public double f (double x , int i ) {
128+
129+ return -9999.0 ;
130+
131+ }
132+
133+
134+
135+ @ Override
136+ public double df (double x , int i ) {
137+
138+ return -9999.0 ;
139+
140+ }
141+
142+
143+
144+ @ Override
145+ public double ddf (double x , int i ) {
146+
147+ return 0 ;
148+
149+ }
150+
151+
152+ }
0 commit comments