Attribute VB_Name = "Module1" Option Explicit Declare PtrSafe Sub WABB00 Lib "C:\Tema11\WABB00.dll" (ByRef clima As Double, ByRef humeini As Double, ByRef humsal As Double, ByRef cn As Double, _ ByRef hsat As Double, ByRef hfcap As Double, ByRef hpmp As Double, ByRef hres As Double, ByRef profmax As Double, ByRef fracco As Double, ByRef fracca As Double, _ ByRef fraccu As Double, ByRef salhyd As Double, ByRef humday As Double, ByRef acolfrac As Double, ByRef acolmat As Double, ByRef dkp As Double, _ ByRef dfrraol As Double, ByRef cco As Double, ByRef ccx As Double, ByRef GDD As Double, ByRef cdc As Double, ByRef tbase As Double, _ ByRef fsiemb As Double, ByRef fsieg As Double, ByRef humemer As Double, ByRef gdsenes As Double, ByRef dsingerm As Double, ByRef flagemer As Integer, _ ByRef pgcover As Double, ByRef kcbx As Double, ByRef fage As Double, ByRef tpotcover As Double, ByRef fraicub As Double, ByRef prfcubmax As Double, _ ByRef rcub As Double, ByRef realtcover As Double, ByRef praic As Double, ByRef opsieg As Double, ByRef marco As Double, ByRef percprof As Double, _ ByRef bulbpar As Double, ByRef ngot As Double, ByRef fgot As Double, ByRef indrieg As Double, ByRef hrieg As Double, ByRef tbvin As Double, _ ByRef BGDDV As Double, ByRef opraicvine As Double, ByRef opfmoist As Double, ByRef humfixed As Double) Sub VABB00VBA() 'Es el modulo de interface con WABYN que esta compilado como DLL. ' Es una adaptación de WABOL ' Updated on October 5 2016. ' Lista de variables ' acolfrac: Matrix con porcentaje de suelo cubierto por acolchado. ' acolmat: Matrix con tipo de material usado en acolchado. ' bulbpar: Matrix con los parámetros (a,b,c) de diametro y prof. de bulbo de humedad. Los tres primeros ' son a, b y c de prof. máxima, y los 3 ñultimos son a, b y c del diámetro maximo. ' cco: Cobertura en emergencia (0-1). ' ccx: Máxima cobertura (0-1. ' cdc: Decrecimiento de cobertura por senescencia, día. ' clima : Matriz con la lluvia, ETo diaria, Tmax y Tmin. (f,c) ' cn: Matriz con los valores de cn. ' cnres: Variable comodin para comprobar que funciona bien el DLL ' cocub: Variable que indica la disposición de la cubierta. ' dkp: Matriz con valores de kp para transpiracion de la viña. Por GDD. ' dfrraol: Matriz conteniendo la fracción de las raíces de la viña en cada zona (f,c). ' dosrieg: Matrix con la cantidad diaria de riego aplicado (mm). ' dsingerm: Número de dias que puedes estar la semilla en el suelo sin germinar sin que afecte a su germinacion. ' fracca: Fracción de la parcela con suelo desnudo y en la calle (0 a 1). ' fage: Reducción de Trans una vez alcanzada la cubierta full cover. %/diario. ' fgot: Caudal de cada gotero, en l/h. ' fracco: Fracción de la parcela cubierta por la copa del arbol (0 a 1). ' fraccu: Fracción de la parcela cubierta por la cubierta vegetal (0 a 1). ' frraicub: Fracción de ráices de la cubierta a profundidad máxima por zona. ' fsieg: Fecha de siega de la cubierta, desde el dia 1 de Septiembre (inclusive). ' fsiemb: Fecha de siembra de la cubierta, desde el dia 1 de Septiembre (inclusive). ' gdd: Aumento de cobertura por grado día. ' GDDv: Matriz conteniendo los GDDa,b y c que definen el crecimiento de la viña. ' gdsenes: Grados día acumulados hasta senescencia. ' hrieg: Matrix con el número de horas de riego por goteo por día. ' hsat: Matriz con valores volumetricos de humedad saturada. (f,c) ' hfcap: Matriz con valores volumetricos de humedad a capacidad de campo. (f,c) ' hpmp: Matriz con valores volumetricos de humedad a marchitez permanente. (f,c) ' hres: Matriz con valores volumetricos de humedad residual. (f,c) ' humeini: Matriz con la humedad inicial en cada horizonte del suelo. (f, c) ' humemer: Humedad relativa de la superficie del suelo necesaria para que emerja la cubierta (0 a 1). ' humday: Matriz con la humedad diaria por zona y horizonte (1 a 13(h), 1 a 3 (zona), 1 a 365 (day)). ' humfixed: Matriz con la humedad inicial en cada horizonte del suelo el día 305, Sept 1st second year (f, c) ' indrieg: Indicador de existencia de riego (1) o no (0) en la simulación. ' marco: Marco de plantación, superficie por viña, m2. ' ngot: Numero de goteros por árbol. ' rcub: Opcion de crecimiento de las raíces de la cubierta (1, crce, (2 estan ya crecidas) ' kcbx: Coeficiente de cultivo máximo de la cubierta. ' opraicvine: Codigo para simular crecimiento de raices (1) o no (2) de las raices de la viña. ' opsieg: Opcion de siega de la cubierta.1 mecanica deja rastrojo, 2 mecanica retira rastrojo, ' 3 quimica deja rastrojo. ' opfmoist: Opción para fijar la humedad del suelo el dia 305. Sept 1sst year 2. ' ped: Matriz con valores volumetricos de pedregosidad. (f,c) ' pgcover: Matriz con la evolucion de la cobertura de suelo de acuerdo a la expresion potencial. ' perprof: Matriz con los valores de percolacion profunda, agua que no cabe en todo el perfil y ' que se eliminamos "virtualmente" por debajo. ' praic: Profundidad de raíces diaria. ' prfcubmax: Profundidad máxima de las raíces de la cubierta, (m) ' profmax: Profundidad máxima de raíces del árbol. ' recub: Opción de crecimiento de la cubierta, 1 (lineal paralela a biomasa aérea) ó 2 continua. ' realtcover: Transpiración real de la cubierta, mm por banda de cubierta, sin normalizar. ' tbase: Temperatura base de la cubierta, ºC. ' tbvin: Temperatura base del viñedo, ºC. ' tpotcover: Transpiracion potencial de la cubierta, mm. ' DECLARACION DE VARIABLES ' ------------------------- Dim clima(1 To 730, 1 To 4) As Double, humeini(1 To 13, 1 To 3) As Double, humsal(1 To 13, 1 To 3) As Double Dim ped(1 To 13, 1 To 3) As Double, hsat(1 To 13, 1 To 3) As Double, hfcap(1 To 13, 1 To 3) As Double, hpmp(1 To 13, 1 To 3) As Double Dim hres(1 To 13, 1 To 3) As Double Dim cn(1 To 3) As Double, cnres As Double, rit As Double, fracca As Double, profmax As Double, fracco As Double, fraccu As Double Dim acolfrac(1 To 3) As Double, acolmat(1 To 3) As Double, tvine As Double Dim f As Integer, c As Integer, m As Integer, indrieg As Double, GDDV(1 To 4) As Double, tbvin As Double Dim salhyd(1 To 730, 1 To 8) As Double, humday(1 To 13, 1 To 3, 1 To 730) As Double Dim marco As Double, supcub As Double, supcop As Double, calle As Double, intra As Double, anchcub As Double, dimoliv As Double Dim ngot As Double, fgot As Double, hrieg(1 To 730) As Double, dosrieg(1 To 730) As Double, bulbpar(1 To 6) As Double Dim dhyd(1 To 730, 1 To 8) As Double, dkp(1 To 3) As Double, dfrraol(1 To 13, 1 To 3) As Double Dim fsiemb As Double, humemer As Double, fsieg As Double, cco As Double, ccx As Double, GDD As Double Dim cdc As Double, tbase As Double, gdsenes As Double, pgcover(1 To 730) As Double, dsingerm As Double, flagemer As Integer Dim tpotcover(1 To 730) As Double, kcbx As Double, fage As Double, prfcubmax As Double, frraicub(1 To 13) As Double Dim realtcover(1 To 730) As Double, praic(1 To 730) As Double, rcub As Double, opsieg As Double, percprof(1 To 730) As Double Dim opraicvine As Double, opfmoist As Double, humfixed(1 To 13, 1 To 3) As Double Dim MatrixA As Variant, MatrixB As Variant, MatrixC As Variant, MatrixCA As Variant, cocub As Double, MatrixCB As Variant Dim MatrixFRRAIOL As Variant, MatrixVKP As Variant, MatrixFRRAI As Variant, MatrixBULRIG As Variant Dim MatrixDR As Variant, A As Variant, FH As Variant, IDAY As Variant 'LECTURA DE DATOS DE ENTRADA '--------------------------- 'Lectura de valores climaticos con loop. a es la matriz con range (730,4). MatrixA = Range("C404:F1133").Value For f = 1 To 730 For c = 1 To 4 clima(f, c) = MatrixA(f, c) Next c Next f 'Lectura de valores de humedad inicial con loop. b es la matriz con range (13, 3) MatrixB = Range("C256:E268").Value For f = 1 To 13 For c = 1 To 3 humeini(f, c) = MatrixB(f, c) Next c Next f ' Lectura de valores de suelo, lo primero que lee es la pedregosidad por si ha de corregir el resto de valores. ' En este paso corrijo la pedregosidad por la fracción de suelo (en volumen) que no es piedra (1-ped) MatrixC = Range("C134:E146").Value For f = 1 To 13 For c = 1 To 3 ped(f, c) = 1 - MatrixC(f, c) Next c Next f ' Ahora lee la humedad saturada y la corrige por la pedregosidad MatrixC = Range("C70:E82").Value For f = 1 To 13 For c = 1 To 3 hsat(f, c) = MatrixC(f, c) * ped(f, c) Next c Next f ' Ahora lee la humedad a capacidad de campo y la corrige por la pedregosidad MatrixC = Range("C86:E98").Value For f = 1 To 13 For c = 1 To 3 hfcap(f, c) = MatrixC(f, c) * ped(f, c) Next c Next f ' Ahora lee la humedad a marchitez permanente y la corrige por la pedregosidad MatrixB = Range("C102:E114").Value For f = 1 To 13 For c = 1 To 3 hpmp(f, c) = MatrixB(f, c) * ped(f, c) Next c Next f ' Ahora lee la humedad residual y la corrige por la pedregosidad MatrixB = Range("C118:E130").Value For f = 1 To 13 For c = 1 To 3 hres(f, c) = MatrixB(f, c) * ped(f, c) Next c Next f ' Aqui lee los valores de CN: CNI, CNII, y CNIII. ca es la matriz con range (3) MatrixCA = Range("D185:D187").Value For f = 1 To 3 cn(f) = MatrixCA(f, 1) Next f ' Aqui lee la profundidad máxima de raíces del árbol que marca el límite para percolacion profmax = Range("D367").Value ' Aqui lee el marco (marco), la superficie de cubierta (supcub), y la superficie de copa (supcop) ' El marco lo estima asumiendo marco rectangular (calle e intra). Pregunta que tipo de viñedo es ' (tvine) calle = Range("D4").Value intra = Range("D5").Value cocub = Range("D7").Value tvine = Range("D16").Value marco = calle * intra dimoliv = Range("D19").Value ' Ahora calcula la superficie fracción de suelo cubierto por viñedo en el marco ' en función del tipo de viñedo If tvine = 1 Then supcop = dimoliv * intra End If If tvine = 2 Then supcop = 3.1416 * (dimoliv * 0.5) * (dimoliv * 0.5) End If fracco = supcop / marco ' Ahora la cubierta. Recuerda que si la anchura de la cubierta hace que pase bajo las copas asumo cubierta ' completa fuera de la proyeccion de la viña. La disposición de las viñas la determina la variable cocub. ' Recuerda que estos cálculos asumen cubierta en la calle siendo la calle definida como la zona anchcub = Range("D331").Value If cocub = 3 Then fraccu = 1 - fracco fracca = 0 End If If cocub = 1 Then If anchcub > (calle - dimoliv) Then fraccu = 1 - fracco fracca = 0 Else fraccu = (anchcub * intra) / marco fracca = 1 - fracco - fraccu End If End If If cocub = 2 Then If anchcub > (intra - dimoliv) Then fraccu = 1 - fracco fracca = 0 Else fraccu = (anchcub * calle) / marco fracca = 1 - fracco - fraccu End If End If ' Lectura de los valores de cobertura de suelo por mulch ' Primero fraccion de suelo cubierto MatrixCB = Range("C274:E274").Value For c = 1 To 3 acolfrac(c) = MatrixCB(1, c) Next c ' Despues codigo de material que cubre el suelo MatrixCB = Range("C281:E281").Value For c = 1 To 3 acolmat(c) = MatrixCB(1, c) Next c 'Lectura de los valores necesarios para calcular la transpiración de la viña ' Primero lee la fracción de raíces de la viña en cada zona del suelo. ' recuerda que es siempre la misma notacion fila (que es profundidad), ' columna (que significa zona). Justo antes de eso lee el codigo de simulacion estatica o ' dinamica de las raíces opraicvine = Range("D369") MatrixFRRAIOL = Range("E375:G387").Value For f = 1 To 13 For c = 1 To 3 dfrraol(f, c) = MatrixFRRAIOL(f, c) Next c Next f ' Despues lee los coeficientes, Kc ordenados para GDD. ' Recuerda son Kc-GDDa, Kc-GDDb, Kc-GDDc. MatrixVKP = Range("D352:D354").Value For m = 1 To 3 dkp(m) = MatrixVKP(m, 1) Next m ' Ahora los parametros de crecimiento de la viña. Tbase y Kc-GDDa, Kc-GDDb, Kc-GDDc. tbvin = Range("D22").Value MatrixVKP = Range("D23:D26").Value For m = 1 To 4 GDDV(m) = MatrixVKP(m, 1) Next m ' Lectura de los valores necesarios para la simulación de la cubierta ' Fecha de siembra fsiemb = Range("D297").Value ' Dias en que la semilla permanece viable en el suelo dsingerm = Range("D300").Value ' Humedad necesaria para germinar humemer = Range("D302").Value ' Fecha de siega fsieg = Range("D306").Value ' Opcion de siega, 1 mecanica deja rastrojo, 2 mecanica retira rastrojo, 3 quimica deja rastrojo opsieg = Range("D309").Value ' Caracteristicas que definen el crecimiento de la cubierta. ' Cobertura en emergencia, CCo cco = Range("D311").Value ' Máxima cobertura ccx = Range("D312").Value ' Aumento de cobertura por grado día. GDD = Range("D313").Value ' Decrecimiento de cobertura por senescencia, día. cdc = Range("D314").Value ' Temperatura base, ºC. tbase = Range("D315").Value ' Grados días hasta senescencia, ºC. FAlta actualizarlo con Fsieg gdsenes = Range("D316").Value ' Coeficiente de cultivo de la cubierta a máxima transpiracion. kcbx = Range("D317").Value ' Coeficiente de reducción de Trans una vez alcanzada la cubierta full cover. %/diario. fage = Range("D318").Value fage = fage / 100 ' De la profundidad máxima de las raíces de la cubierta. prfcubmax = Range("D334").Value ' De la opción de crecimiento de la cubierta, 1 (lineal paralela a biomasa aérea) ó 2 continua. rcub = Range("D337").Value ' Ahora lee la fracción de raíces de la cubierta en cada zona del suelo. ' recuerda que es siempre la misma notacion fila (que es profundidad), ' columna (que significa zona). MatrixFRRAI = Range("G332:G344").Value For f = 1 To 13 frraicub(f) = MatrixFRRAI(f, 1) Next f ' Lectura de valores relacionados con el riego. ' Primero lee si hay riego o no. indrieg = Range("D43").Value ' Ahora lee los valores de número de goteros y de flujo de gotero. ' Si no hay riego lo hace cero. If indrieg = 1# Then ngot = Range("D45").Value fgot = Range("D46").Value Else ngot = 0# fgot = 0# End If 'Ahora lee los parametros que definen el bulbo de riego If indrieg = 1# Then MatrixBULRIG = Range("C288:C293").Value For f = 1 To 6 bulbpar(f) = MatrixBULRIG(f, 1) Next f Else For f = 1 To 6 bulbpar(f) = 0# Next f End If ' Ahora lee las horas de riego diarias. Simultánemente calcula los mm de riego diarios, normalizados ' al marco de plantación. Si es dos, lo hago cero If indrieg = 1# Then MatrixFRRAI = Range("G404:G1133").Value For f = 1 To 730 hrieg(f) = MatrixFRRAI(f, 1) dosrieg(f) = (hrieg(f) * ngot * fgot) / marco Next f End If If indrieg = 2# Then For f = 1 To 730 hrieg(f) = 0# dosrieg(f) = 0# Next f End If 'Ahora lee la opción de fijar la humedad del suelo el día 305, Sept 1st del segundo año. opfmoist = Range("D1139").Value ' Despues la humedad ese día MatrixB = Range("C1145:E1157").Value For f = 1 To 13 For c = 1 To 3 humfixed(f, c) = MatrixB(f, c) Next c Next f ' LLAMADA AL MODELO FORTRAN EN EL DLL '------------------------------------- ' Aqui llama a WABB00 para leer y transferir matrices Call WABB00(clima(1, 1), humeini(1, 1), humsal(1, 1), cn(1), _ hsat(1, 1), hfcap(1, 1), hpmp(1, 1), hres(1, 1), profmax, fracco, fracca, _ fraccu, salhyd(1, 1), humday(1, 1, 1), acolfrac(1), acolmat(1), dkp(1), _ dfrraol(1, 1), cco, ccx, GDD, cdc, tbase, fsiemb, fsieg, humemer, gdsenes, _ dsingerm, flagemer, pgcover(1), kcbx, fage, tpotcover(1), frraicub(1), _ prfcubmax, rcub, realtcover(1), praic(1), opsieg, marco, percprof(1), _ bulbpar(1), ngot, fgot, indrieg, hrieg(1), tbvin, GDDV(1), opraicvine, _ opfmoist, humfixed(1, 1)) 'ESCRITURA DE VALORES DE SALIDA '------------------------------- ' De clima como input For f = 1 To 730 For c = 1 To 4 A(f, c) = clima(f, c) Next c Next f Range("OUTPUTS!C3:F732").Value = clima ' De salidas hidrológicas For f = 1 To 730 For c = 1 To 8 dhyd(f, c) = salhyd(f, c) Next c Next f Range("OUTPUTS!G3:N732").Value = dhyd ' De dosis de riego. Usa el truco para dar formato a dr MatrixDR = Range("MOISTVINES!A2:A731").Value For f = 1 To 730 MatrixDR(f, 1) = dosrieg(f) Next Range("OUTPUTS!Q3:Q732").Value = MatrixDR ' Antes da formato a dos matrices con un truco FH = Range("MOISTVINES!B2:N731").Value IDAY = Range("MOISTVINES!A2:A731").Value ' Término de percolación profunda For f = 1 To 730 FH(f, 1) = percprof(f) Next f Range("OUTPUTS!P3:P732").Value = FH ' De humedad diaria en copa For f = 1 To 730 For c = 1 To 13 FH(f, c) = humday(c, 1, f) IDAY(f, 1) = f Next c Next f Range("MOISTVINES!A2:A731").Value = IDAY Range("MOISTVINES!B2:N731").Value = FH ' De humedad diaria en calle For f = 1 To 730 For c = 1 To 13 FH(f, c) = humday(c, 2, f) Next c Next f Range("MOISTLANEBARE!A2:A731").Value = IDAY Range("MOISTLANEBARE!B2:N731").Value = FH ' De humedad diaria en cubierta For f = 1 To 730 For c = 1 To 13 FH(f, c) = humday(c, 3, f) Next c Next f Range("MOISTLANECOVER!A2:A731").Value = IDAY Range("MOISTLANECOVER!B2:N731").Value = FH ' Escribe las fracciones de suelo cubiertas por cada zona Range("BALANCE!N2:N731").Value = fracca Range("BALANCE!O2:O731").Value = fraccu Range("BALANCE!P2:P731").Value = fracco ' De coberura de suelo potencial en la banda de cubiertas For f = 1 To 730 FH(f, 1) = pgcover(f) Next f Range("COVER!C2:C731").Value = FH 'Escribe si el modelo simulo o no una cubierta vegetal' If fraccu = 0 Then Range("COVER!A2").Value = "NO" End If If fraccu > 0 Then Range("COVER!A2").Value = "YES" End If ' Indica si el modelo intentó simular una cubierta pero fracasó If flagemer = 1 Then Range("COVER!A4").Value = "YES" Else Range("COVER!A4").Value = "NO" End If ' De transpiración potencial de la cubierta, en mm por banda de cubierta. ' Ojo, da solo lo del segundo año que es el que simula For f = 1 To 730 FH(f, 1) = tpotcover(f) Next f Range("COVER!D2:D731").Value = FH ' De transpiración real de la cubierta, en mm por banda de cubierta. ' Ojo, da sólo el segundo año que es el que simula. For f = 1 To 730 FH(f, 1) = realtcover(f) Next f Range("COVER!E2:E731").Value = FH ' De profundidad de raíces, en m. For f = 1 To 730 FH(f, 1) = praic(f) Next f Range("COVER!F2:F731").Value = FH End Sub