From b41146cda5d062ed1702e827d2eb07a3ecc6e772 Mon Sep 17 00:00:00 2001 From: Tucker Siegel <tgsiegel@umd.edu> Date: Wed, 1 Dec 2021 14:52:25 -0500 Subject: [PATCH] upgrade to add maturity --- Dockerfile.dev | 9 + Dockerfile.prod | 8 + controllers/maturity_controller.go | 68 ++ controllers/routes.go | 5 +- controllers/seed_controllers.go | 66 +- docs/docs.go | 168 ++- docs/swagger.json | 166 ++- docs/swagger.yaml | 127 +- go.mod | 2 + go.sum | 5 + lib/__pycache__/mz.cpython-37.pyc | Bin 0 -> 449 bytes lib/maize/DSSAT.INP | 111 ++ lib/maize/MZCER047.CUL | 245 ++++ lib/maize/MZCER047.ECO | 29 + lib/maize/MZCER047.SPE | 87 ++ lib/maize/execute.py | 243 ++++ lib/maize/mz.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 238632 bytes lib/maize/mz.f | 1209 +++++++++++++++++++ lib/maize/mz.o | Bin 0 -> 36752 bytes models/maturity.go | 114 ++ models/seeds.go | 91 +- persistence/entities/gdd.go | 3 + persistence/entities/maturity.go | 13 + persistence/mongodb.go | 51 +- services/maturity_service.go | 147 +++ services/seed_service.go | 116 +- 26 files changed, 2869 insertions(+), 214 deletions(-) create mode 100644 controllers/maturity_controller.go create mode 100644 lib/__pycache__/mz.cpython-37.pyc create mode 100644 lib/maize/DSSAT.INP create mode 100644 lib/maize/MZCER047.CUL create mode 100644 lib/maize/MZCER047.ECO create mode 100644 lib/maize/MZCER047.SPE create mode 100644 lib/maize/execute.py create mode 100644 lib/maize/mz.cpython-38-x86_64-linux-gnu.so create mode 100644 lib/maize/mz.f create mode 100644 lib/maize/mz.o create mode 100644 models/maturity.go create mode 100644 persistence/entities/maturity.go create mode 100644 services/maturity_service.go diff --git a/Dockerfile.dev b/Dockerfile.dev index 88679e4..1a22f56 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,9 +1,18 @@ FROM dawn/dawn-cli as base + RUN mkdir /app ADD . /app WORKDIR /app +RUN apt-get update && apt-get install -y python3 python3-dev python3-pip gfortran +RUN pip3 install numpy + +WORKDIR /app/lib/maize +RUN f2py mz.f -c -m mz + +WORKDIR /app + RUN go get -u gitlab.cs.umd.edu/dawn/dawn-go-common RUN go mod tidy diff --git a/Dockerfile.prod b/Dockerfile.prod index 5c955de..f2a6336 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -4,6 +4,14 @@ RUN mkdir /app ADD . /app WORKDIR /app +RUN apt-get update && apt-get install -y python3.9 python3.9-dev +RUN pip install numpy + +WORKDIR /app/lib/maize +RUN f2py mz.f -c -m mz + +WORKDIR /app + RUN go get gitlab.cs.umd.edu/dawn/dawn-go-common RUN curl -LJ -o swag.tar.gz https://github.com/swaggo/swag/releases/download/v1.7.4/swag_1.7.4_Linux_x86_64.tar.gz diff --git a/controllers/maturity_controller.go b/controllers/maturity_controller.go new file mode 100644 index 0000000..c541c61 --- /dev/null +++ b/controllers/maturity_controller.go @@ -0,0 +1,68 @@ +package controllers + +import ( + "github.com/gofiber/fiber/v2" + "gitlab.cs.umd.edu/dawn/dawn-go-common/common" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services" +) + +type MaturityRequest struct { + PlantDate int `json:"plantdate"` + Tmins []float32 `json:"tmins"` + Tmaxs []float32 `json:"tmaxs"` + Srads []float32 `json:"srads"` + Rains []float32 `json:"rains"` + Units string `json:"units"` +} + +type ResponseTest struct { + Date int `json:"date"` +} + +// GetCultivars godoc +// @Summary Get all generic corn cultivars +// @Tags Maturity +// @Description Get all generic corn cultivars +// @Accept json +// @Produce json +// @Success 200 {object} models.CultivarResponse +// @Failure 400 {object} common.StandardError +// @Param name query string false "Name of cultivar to get" +// @Router /gdd/maturity/corn/cultivars [get] +func GetCultivars(c *fiber.Ctx) error { + ctx := common.DawnCtx{FiberCtx: c} + request := models.CultivarRequest{ + Name: c.Query("name", ""), + } + return c.Status(fiber.StatusOK).JSON(services.GetCultivars(ctx, request)) +} + +// GetMaturity godoc +// @Summary Get expected maturity date +// @Tags Maturity +// @Description Get expected maturity date +// @Accept json +// @Produce json +// @Success 200 {object} models.CultivarResponse +// @Failure 400 {object} common.StandardError +// @Param latitude query number true "Latitude to search for" +// @Param longitude query number true "Longitude to search for" +// @Param plant_month query number true "Platning month" +// @Param plant_date query number true "Platning date" +// @Param var_name query string true "Name of cultivar" +// @Param var_num query string true "ID# of cultivar" +// @Param eco_num query string true "Eco# of cultivar" +// @Param p1 query number true "P1 value of cultivar" +// @Param p2 query number true "P2 value of cultivar" +// @Param p5 query number true "P5 value of cultivar" +// @Param g2 query number true "G2 value of cultivar" +// @Param g3 query number true "G3 value of cultivar" +// @Param phint query number true "PHINT value of cultivar" +// @Router /gdd/maturity/corn [get] +func GetMaturity(c *fiber.Ctx) error { + ctx := common.DawnCtx{FiberCtx: c} + request := models.BuildCornMaturityRequest(ctx) + return c.Status(fiber.StatusOK).JSON(services.CalculateMaturity(ctx, request)) + +} diff --git a/controllers/routes.go b/controllers/routes.go index 727996d..010a2b5 100644 --- a/controllers/routes.go +++ b/controllers/routes.go @@ -16,6 +16,7 @@ func GddRoutes(route fiber.Router) { route.Get("gdd/csv", GetCSVFile) - route.Get("gdd/maturity/corn", GetCornSeedMaturityDate) - route.Get("gdd/seeds", GetSeedList) + route.Get("gdd/maturity/corn", GetMaturity) + route.Get("gdd/maturity/corn/cultivars", GetCultivars) + // route.Get("gdd/seeds", GetSeedList) } diff --git a/controllers/seed_controllers.go b/controllers/seed_controllers.go index c3ac845..d9dc4d4 100644 --- a/controllers/seed_controllers.go +++ b/controllers/seed_controllers.go @@ -1,38 +1,38 @@ package controllers -import ( - "gitlab.cs.umd.edu/dawn/dawn-go-common/common" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services" +// import ( +// "gitlab.cs.umd.edu/dawn/dawn-go-common/common" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services" - "github.com/gofiber/fiber/v2" -) +// "github.com/gofiber/fiber/v2" +// ) -func GetSeedList(c *fiber.Ctx) error { - request := models.SeedListRequest{Product: c.Query("product")} - return c.Status(fiber.StatusOK).JSON( - services.GetSeedList(c, request), - ) -} +// func GetSeedList(c *fiber.Ctx) error { +// request := models.SeedListRequest{Product: c.Query("product")} +// return c.Status(fiber.StatusOK).JSON( +// services.GetSeedList(c, request), +// ) +// } -// GetCornSeedMaturityDate godoc -// @Summary Get estimated maturity date from given gdd (uses CFS data if current GDUs are less than the crop maturity) -// @Tags GDD Maturity Data -// @Description Get estimated maturity date from given gdd -// @Accept json -// @Produce json -// @Success 200 {object} models.CornMaturityResponse -// @Failure 400 {object} common.StandardError -// @Param latitude query number true "Latitude to search for" -// @Param longitude query number true "Longitude to search for" -// @Param gdds query number true "number of gdds given" -// @Param month query number true "month planted" -// @Param date query number true "date planted" -// @Router /gdd/maturity/corn [get] -func GetCornSeedMaturityDate(c *fiber.Ctx) error { - ctx := common.DawnCtx{FiberCtx: c} - request := models.BuildCornMaturityRequest(c) - return c.Status(fiber.StatusOK).JSON( - services.GetCornMaturityDate(ctx, request), - ) -} +// // GetCornSeedMaturityDate godoc +// // @Summary Get estimated maturity date from given gdd (uses CFS data if current GDUs are less than the crop maturity) +// // @Tags GDD Maturity Data +// // @Description Get estimated maturity date from given gdd +// // @Accept json +// // @Produce json +// // @Success 200 {object} models.CornMaturityResponse +// // @Failure 400 {object} common.StandardError +// // @Param latitude query number true "Latitude to search for" +// // @Param longitude query number true "Longitude to search for" +// // @Param gdds query number true "number of gdds given" +// // @Param month query number true "month planted" +// // @Param date query number true "date planted" +// // @Router /gdd/maturity/corn [get] +// func GetCornSeedMaturityDate(c *fiber.Ctx) error { +// ctx := common.DawnCtx{FiberCtx: c} +// request := models.BuildCornMaturityRequest(c) +// return c.Status(fiber.StatusOK).JSON( +// services.GetCornMaturityDate(ctx, request), +// ) +// } diff --git a/docs/docs.go b/docs/docs.go index 2d3b55d..bb29808 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -235,6 +235,22 @@ var doc = `{ "in": "query", "required": true }, + { + "enum": [ + 80, + 85, + 90, + 95, + 99, + 99.5, + 99.9 + ], + "type": "number", + "description": "Interval values", + "name": "Interval", + "in": "query", + "required": true + }, { "type": "number", "description": "Latitude to search for", @@ -583,7 +599,7 @@ var doc = `{ }, "/gdd/maturity/corn": { "get": { - "description": "Get estimated maturity date from given gdd", + "description": "Get expected maturity date", "consumes": [ "application/json" ], @@ -591,9 +607,9 @@ var doc = `{ "application/json" ], "tags": [ - "GDD Maturity Data" + "Maturity" ], - "summary": "Get estimated maturity date from given gdd (uses CFS data if current GDUs are less than the crop maturity)", + "summary": "Get expected maturity date", "parameters": [ { "type": "number", @@ -611,22 +627,78 @@ var doc = `{ }, { "type": "number", - "description": "number of gdds given", - "name": "gdds", + "description": "Platning month", + "name": "plant_month", "in": "query", "required": true }, { "type": "number", - "description": "month planted", - "name": "month", + "description": "Platning date", + "name": "plant_date", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Name of cultivar", + "name": "var_name", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "ID# of cultivar", + "name": "var_num", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Eco# of cultivar", + "name": "eco_num", "in": "query", "required": true }, { "type": "number", - "description": "date planted", - "name": "date", + "description": "P1 value of cultivar", + "name": "p1", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "P2 value of cultivar", + "name": "p2", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "P5 value of cultivar", + "name": "p5", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "G2 value of cultivar", + "name": "g2", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "G3 value of cultivar", + "name": "g3", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "PHINT value of cultivar", + "name": "phint", "in": "query", "required": true } @@ -635,7 +707,44 @@ var doc = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.CornMaturityResponse" + "$ref": "#/definitions/models.CultivarResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/common.StandardError" + } + } + } + } + }, + "/gdd/maturity/corn/cultivars": { + "get": { + "description": "Get all generic corn cultivars", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maturity" + ], + "summary": "Get all generic corn cultivars", + "parameters": [ + { + "type": "string", + "description": "Name of cultivar to get", + "name": "name", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CultivarResponse" } }, "400": { @@ -816,23 +925,46 @@ var doc = `{ } } }, - "models.CornMaturityResponse": { + "models.Cultivar": { "type": "object", "properties": { - "closest_gdd": { + "eco_num": { + "type": "string" + }, + "g2": { "type": "number" }, - "closest_latitude": { + "g3": { "type": "number" }, - "closest_longitude": { + "p1": { "type": "number" }, - "date": { - "type": "string" + "p2": { + "type": "number" + }, + "p5": { + "type": "number" }, - "gdd": { + "phint": { "type": "number" + }, + "var_name": { + "type": "string" + }, + "var_num": { + "type": "string" + } + } + }, + "models.CultivarResponse": { + "type": "object", + "properties": { + "cultivars": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Cultivar" + } } } }, @@ -988,5 +1120,5 @@ func (s *s) ReadDoc() string { } func init() { - swag.Register(swag.Name, &s{}) + swag.Register("swagger", &s{}) } diff --git a/docs/swagger.json b/docs/swagger.json index c124f4e..1b8b582 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -218,6 +218,22 @@ "in": "query", "required": true }, + { + "enum": [ + 80, + 85, + 90, + 95, + 99, + 99.5, + 99.9 + ], + "type": "number", + "description": "Interval values", + "name": "Interval", + "in": "query", + "required": true + }, { "type": "number", "description": "Latitude to search for", @@ -566,7 +582,7 @@ }, "/gdd/maturity/corn": { "get": { - "description": "Get estimated maturity date from given gdd", + "description": "Get expected maturity date", "consumes": [ "application/json" ], @@ -574,9 +590,9 @@ "application/json" ], "tags": [ - "GDD Maturity Data" + "Maturity" ], - "summary": "Get estimated maturity date from given gdd (uses CFS data if current GDUs are less than the crop maturity)", + "summary": "Get expected maturity date", "parameters": [ { "type": "number", @@ -594,22 +610,78 @@ }, { "type": "number", - "description": "number of gdds given", - "name": "gdds", + "description": "Platning month", + "name": "plant_month", "in": "query", "required": true }, { "type": "number", - "description": "month planted", - "name": "month", + "description": "Platning date", + "name": "plant_date", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Name of cultivar", + "name": "var_name", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "ID# of cultivar", + "name": "var_num", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "Eco# of cultivar", + "name": "eco_num", "in": "query", "required": true }, { "type": "number", - "description": "date planted", - "name": "date", + "description": "P1 value of cultivar", + "name": "p1", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "P2 value of cultivar", + "name": "p2", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "P5 value of cultivar", + "name": "p5", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "G2 value of cultivar", + "name": "g2", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "G3 value of cultivar", + "name": "g3", + "in": "query", + "required": true + }, + { + "type": "number", + "description": "PHINT value of cultivar", + "name": "phint", "in": "query", "required": true } @@ -618,7 +690,44 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.CornMaturityResponse" + "$ref": "#/definitions/models.CultivarResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/common.StandardError" + } + } + } + } + }, + "/gdd/maturity/corn/cultivars": { + "get": { + "description": "Get all generic corn cultivars", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Maturity" + ], + "summary": "Get all generic corn cultivars", + "parameters": [ + { + "type": "string", + "description": "Name of cultivar to get", + "name": "name", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CultivarResponse" } }, "400": { @@ -799,23 +908,46 @@ } } }, - "models.CornMaturityResponse": { + "models.Cultivar": { "type": "object", "properties": { - "closest_gdd": { + "eco_num": { + "type": "string" + }, + "g2": { "type": "number" }, - "closest_latitude": { + "g3": { "type": "number" }, - "closest_longitude": { + "p1": { "type": "number" }, - "date": { - "type": "string" + "p2": { + "type": "number" + }, + "p5": { + "type": "number" }, - "gdd": { + "phint": { "type": "number" + }, + "var_name": { + "type": "string" + }, + "var_num": { + "type": "string" + } + } + }, + "models.CultivarResponse": { + "type": "object", + "properties": { + "cultivars": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Cultivar" + } } } }, diff --git a/docs/swagger.yaml b/docs/swagger.yaml index b9e54da..497d78f 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -59,18 +59,33 @@ definitions: type: number type: array type: object - models.CornMaturityResponse: + models.Cultivar: properties: - closest_gdd: + eco_num: + type: string + g2: type: number - closest_latitude: + g3: type: number - closest_longitude: + p1: type: number - date: - type: string - gdd: + p2: type: number + p5: + type: number + phint: + type: number + var_name: + type: string + var_num: + type: string + type: object + models.CultivarResponse: + properties: + cultivars: + items: + $ref: '#/definitions/models.Cultivar' + type: array type: object models.FreezingDateResponse: properties: @@ -289,6 +304,19 @@ paths: name: product required: true type: string + - description: Interval values + enum: + - 80 + - 85 + - 90 + - 95 + - 99 + - 99.5 + - 99.9 + in: query + name: Interval + required: true + type: number - description: Latitude to search for in: query name: latitude @@ -542,7 +570,7 @@ paths: get: consumes: - application/json - description: Get estimated maturity date from given gdd + description: Get expected maturity date parameters: - description: Latitude to search for in: query @@ -554,36 +582,99 @@ paths: name: longitude required: true type: number - - description: number of gdds given + - description: Platning month + in: query + name: plant_month + required: true + type: number + - description: Platning date in: query - name: gdds + name: plant_date required: true type: number - - description: month planted + - description: Name of cultivar + in: query + name: var_name + required: true + type: string + - description: ID# of cultivar in: query - name: month + name: var_num + required: true + type: string + - description: Eco# of cultivar + in: query + name: eco_num + required: true + type: string + - description: P1 value of cultivar + in: query + name: p1 required: true type: number - - description: date planted + - description: P2 value of cultivar in: query - name: date + name: p2 required: true type: number + - description: P5 value of cultivar + in: query + name: p5 + required: true + type: number + - description: G2 value of cultivar + in: query + name: g2 + required: true + type: number + - description: G3 value of cultivar + in: query + name: g3 + required: true + type: number + - description: PHINT value of cultivar + in: query + name: phint + required: true + type: number + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CultivarResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/common.StandardError' + summary: Get expected maturity date + tags: + - Maturity + /gdd/maturity/corn/cultivars: + get: + consumes: + - application/json + description: Get all generic corn cultivars + parameters: + - description: Name of cultivar to get + in: query + name: name + type: string produces: - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.CornMaturityResponse' + $ref: '#/definitions/models.CultivarResponse' "400": description: Bad Request schema: $ref: '#/definitions/common.StandardError' - summary: Get estimated maturity date from given gdd (uses CFS data if current - GDUs are less than the crop maturity) + summary: Get all generic corn cultivars tags: - - GDD Maturity Data + - Maturity /gdd/normals: get: consumes: diff --git a/go.mod b/go.mod index d5e0e03..b85d374 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,8 @@ module gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd go 1.16 require ( + github.com/DataDog/go-python3 v0.0.0-20211102160307-40adc605f1fe // indirect + github.com/Konstantin8105/f4go v0.0.0-20211017110926-3b02a09b3573 // indirect github.com/andybalholm/brotli v1.0.3 // indirect github.com/ansrivas/fiberprometheus/v2 v2.1.2 github.com/arsmn/fiber-swagger/v2 v2.15.0 diff --git a/go.sum b/go.sum index 066b7fc..a2bfdc2 100644 --- a/go.sum +++ b/go.sum @@ -44,7 +44,11 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/go-python3 v0.0.0-20211102160307-40adc605f1fe h1:bNMi0HArOQY4899TKLi4RP7g9BZ2kwLOiVpoJHWxyFs= +github.com/DataDog/go-python3 v0.0.0-20211102160307-40adc605f1fe/go.mod h1:7ctnOCLiUlwKO9GvAjusUF68edSbiHqC18gVPQF0ojA= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Konstantin8105/f4go v0.0.0-20211017110926-3b02a09b3573 h1:brai4FFFTuoeMW97HzZMR5sKSporPtYLvYMl+naNQrI= +github.com/Konstantin8105/f4go v0.0.0-20211017110926-3b02a09b3573/go.mod h1:vZxW3sVrJfWNzLsO8EYioT8eWMzkdOVu8AqFqj+IWhs= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -89,6 +93,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013 h1:/P9/RL0xgWE+ehnCUUN5h3RpG3dmoMCOONO1CCvq23Y= github.com/bradfitz/slice v0.0.0-20180809154707-2b758aa73013/go.mod h1:pccXHIvs3TV/TUqSNyEvF99sxjX2r4FFRIyw6TZY9+w= +github.com/bradleyjkemp/cupaloy v2.3.0+incompatible/go.mod h1:Au1Xw1sgaJ5iSFktEhYsS0dbQiS1B0/XMXl+42y9Ilk= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= diff --git a/lib/__pycache__/mz.cpython-37.pyc b/lib/__pycache__/mz.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a6fd888b05ecc6b7d837d93e3963bc71aae9e45 GIT binary patch literal 449 zcmYLEu};G<5Ix&z8>(brV`Za5>H$<$0-*|+7`gyU7R!lEiJHWbortz8d`LSm@Jm^l z_ys2HpwhGM-Me?EyYo#L4#C=P_QB5(z?Vz*=2<ecZtg7z5a=B^2rNjBV$?+(<1Uhz zNWArAPk1}b`-1R60?9y<tuK3Ze}@s&@CFD3d4N$bwe$YXZiQRx#;p@z>uCN7+Q|p_ zxuiu|)093LsSSN>(xue&PMT${Dk}JENfU0hQglhQ5Q64eLW|9~TDKu%iBh$xHLn<R zlMS{2NE3_Sj?Ooywl}TT^@}Q_^J%o2PT1rk%CoXrMT@c-8#OxW`debwCJw9Rf@x_~ zqf=>Ok`+~aywBNlmdlbCvh^8rkuk@dYT1ynTyY^aV{zaZ6KmU)rHB9iF?VF^UlmF; TxxDV~4y@$k6BHoNz5x9KLhx<7 literal 0 HcmV?d00001 diff --git a/lib/maize/DSSAT.INP b/lib/maize/DSSAT.INP new file mode 100644 index 0000000..d766513 --- /dev/null +++ b/lib/maize/DSSAT.INP @@ -0,0 +1,111 @@ +*MODEL INPUT FILE A 8 1 8 8 0 +*FILES +MODEL MZCER047 +FILEX nml +FILEA nml . A +FILET nml . T +SPECIES MZCER047.SPE +ECOTYPE MZCER047.ECO +CULTIVAR MZCER047.CUL +PESTS MZCER047.PST ///glade/u/home/sunchao/model/dssat-csm-os/bin/Pest/ +SOILS SOIL.SOL +WEATHERW UFGA8201.WTH +OUTPUT OVERVIEW +*SIMULATION CONTROL + 1 1 S 1982056 2150 N X IRRIGATION, GAINESVI + Y Y N N N N N Y M + M M E R S R R 1 G S 2 D 0 + R R R N M + N Y Y 1 Y N Y Y N N Y N N +!AUTOMATIC MANAGEM + -99 -99 40. 100. 30. 40. 10. + 30. 50. 100. GS000 IR001 10.0 1.000 + 30. 50. 25. FE001 GS000 + 100. 1 20. + 0 -99 100. 0. +*EXP.DETAILS + 1nml NIT X IRR, GAINESVILLE 2N*3I +*TREATMENTS + 8 1 0 0 IRRIGATED HIGH NITROGENl +*CULTIVARS + MZ IB0006 McCurdy 84aa +*FIELDS + UFGA0002 UFGA8201 0.0 0. DR000 0. 100.0 00000 -99 180. IBMZ910014 + 29.63000 -82.37000 40.00 1.0 100. 1.0 0.0 -99 -99 +*INITIAL CONDITIONS + MZ 1982156 100 0 1.00 1.00 0.0 1000 0.80 0.00 100. 15. + 5. 0.086 0.500 0.100 + 15. 0.086 0.500 0.100 + 30. 0.086 0.500 0.100 + 45. 0.086 0.500 0.100 + 60. 0.086 0.500 0.100 + 90. 0.076 0.600 0.100 + 120. 0.076 0.500 0.100 + 150. 0.130 0.500 0.100 + 180. 0.258 0.500 0.100 +*PLANTING DETAILS + 1982157 -99 7.2 7.2 S R 61. 0. 7.0 -99. -99. -99.0 -99.0 0.0 +*IRRIGATION + 1.000 30. 75. -99. GS000 IR001 0.0 + 1982063 IR001 13.0 + 1982077 IR001 10.0 + 1982094 IR001 10.0 + 1982107 IR001 13.0 + 1982111 IR001 18.0 + 1982122 IR001 25.0 + 1982126 IR001 25.0 + 1982129 IR001 13.0 + 1982132 IR001 15.0 + 1982134 IR001 19.0 + 1982137 IR001 20.0 + 1982141 IR001 20.0 + 1982148 IR001 15.0 + 1982158 IR001 19.0 + 1982161 IR001 4.0 + 1982162 IR001 25.0 +*FERTILIZERS + 1982074 FE001 AP001 10. 56. 0. 0. 0. 0. -99 + 1982089 FE001 AP001 10. 52. 0. 0. 0. 0. -99 + 1982102 FE001 AP001 10. 75. 0. 0. 0. 0. -99 + 1982118 FE001 AP001 10. 37. 0. 0. 0. 0. -99 + 1982127 FE001 AP001 10. 55. 0. 0. 0. 0. -99 + 1982137 FE001 AP001 10. 126. 0. 0. 0. 0. -99 +*RESIDUES +*CHEMICALS +*TILLAGE +*ENVIRONMENT +*HARVEST +*SOIL + IBMZ910014 Gainesville -99 180. Millhopper Fine Sand + Gainesville USA 29.630 -82.370 Loamy,silic,hyperth Arenic Paleudult + -99 0.18 2.0 0.65 60. 1.00 0.92 IB001 IB001 IB001 -99 + 5. 0.026 0.096 0.230 1.000 -99. 1.30 2.000 -99.0 -99.0 -99.0 -9.0 7.00-99.00 20.00-99.00 + 15. 0.025 0.086 0.230 1.000 -99. 1.30 1.000 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 30. 0.025 0.086 0.230 0.700 -99. 1.40 1.000 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 45. 0.025 0.086 0.230 0.300 -99. 1.40 0.500 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 60. 0.025 0.086 0.230 0.300 -99. 1.40 0.500 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 90. 0.028 0.090 0.230 0.050 -99. 1.45 0.100 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 120. 0.028 0.090 0.230 0.030 -99. 1.45 0.100 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 150. 0.029 0.130 0.230 0.002 -99. 1.45 0.040 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + 180. 0.070 0.258 0.360 0.000 -99. 1.20 0.240 -99.0 -99.0 -99.0 -9.0 7.00-99.00-99.00-99.00 + + 5.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 15.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 30.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 45.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 60.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 90.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 120.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 150.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + 180.-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0 -99.0-99.00 -99.0 -99.0 -99.0 -99.0 -99.0 -99. + + 5.-99.00-99.00-99.00-99.00 + 15.-99.00-99.00-99.00-99.00 + 30.-99.00-99.00-99.00-99.00 + 45.-99.00-99.00-99.00-99.00 + 60.-99.00-99.00-99.00-99.00 + 90.-99.00-99.00-99.00-99.00 + 120.-99.00-99.00-99.00-99.00 + 150.-99.00-99.00-99.00-99.00 + 180.-99.00-99.00-99.00-99.00 +*CULTIVAR diff --git a/lib/maize/MZCER047.CUL b/lib/maize/MZCER047.CUL new file mode 100644 index 0000000..7c65e59 --- /dev/null +++ b/lib/maize/MZCER047.CUL @@ -0,0 +1,245 @@ +*MAIZE CULTIVAR COEFFICIENTS: MZCER047 MODEL +! +!The P1 values for the varieties used in experiments IBWA8301 and +!UFGA8201 were recalibrated to obtain a better fit for version 3 +!of the model. After converting from 2.1 to 3.0 the varieties +!IB0035, IB0060, and IB0063 showed an earlier simulated flowering +!date. To correct this, the P1 values were recalibrated. +!The reason for this is that there was an error in PHASEI in +!version 2.1 that had TLNO=IFIX(CUMDTT/21.+6.) rather than +!TLNO=IFIX(SUMDTT/21.+6.); see p. 74 of Jones & Kiniry. +!-Walter Bowen, 22 DEC 1994. +! +!All G2 values were increased by a factor of 1.1 for Ritchie's +!change to RUE -Walter, 28 DEC 1994 +! +! COEFF DEFINITIONS +! ======== =========== +! VAR# Identification code or number for a specific cultivar +! VAR-NAME Name of cultivar +! EXPNO Number of experiments used to estimate cultivar parameters +! ECO# Ecotype code of this cultivar, points to the Ecotype in the +! ECO file (currently not used). +! P1 Thermal time from seedling emergence to the end of the juvenile +! phase (expressed in degree days above a base temperature of 8 deg.C) +! during which the plant is not responsive to changes in +! photoperiod. +! P2 Extent to which development (expressed as days) is delayed for +! each hour increase in photoperiod above the longest photoperiod +! at which development proceeds at a maximum rate (which is +! considered to be 12.5 hours). +! P5 Thermal time from silking to physiological maturity (expressed +! in degree days above a base temperature of 8 deg.C). +! G2 Maximum possible number of kernels per plant. +! G3 Kernel filling rate during the linear grain filling stage and +! under optimum conditions (mg/day). +! PHINT Phylochron interval; the interval in thermal time (degree days) +! between successive leaf tip appearances. +! +! PIO Pioneer +! AS Asgrow (Monsanto) +! DK Dekalb (Monsanto) +! LH Holden (Monsanto) +! C/LOL Land of Lakes +! +@VAR# VRNAME.......... EXPNO ECO# P1 P2 P5 G2 G3 PHINT +! 1 2 3 4 5 6 +PC0001 2500-2600 GDD . IB0001 160.0 0.750 780.0 750.0 8.50 49.00 +PC0002 2600-2650 GDD . IB0001 185.0 0.750 850.0 800.0 8.50 49.00 +PC0003 2650-2700 GDD . IB0001 212.0 0.750 850.0 800.0 8.50 49.00 +PC0004 2700-2750 GDD . IB0001 240.0 0.750 850.0 800.0 8.50 49.00 +PC0005 2750-2800 GDD . IB0001 260.0 0.750 850.0 800.0 8.50 49.00 + +990001 LONG SEASON . IB0001 320.0 0.520 940.0 620.0 6.00 38.90 +990002 MEDIUM SEASON . IB0001 200.0 0.300 800.0 700.0 8.50 38.90 +990003 SHORT SEASON . IB0001 110.0 0.300 680.0 820.4 6.60 38.90 +990004 V.SHORT SEASON . IB0001 5.0 0.300 680.0 820.4 6.60 38.90 +! +IB0001 CORNL281 . IB0001 110.0 0.300 685.0 907.9 6.60 38.90 +IB0002 CP170 . IB0001 120.0 0.000 685.0 907.9 10.00 38.90 +IB0003 LG11 . IB0001 125.0 0.000 685.0 907.9 10.00 38.90 +IB0004 F7 X F2 . IB0001 125.0 0.000 685.0 907.9 10.00 38.90 +IB0005 PIO 3995 . IB0001 130.0 0.300 685.0 907.9 8.60 38.90 +IB0006 INRA . IB0001 135.0 0.000 685.0 907.9 10.00 38.90 +IB0007 EDO . IB0001 135.0 0.300 685.0 907.9 10.40 38.90 +IB0008 A654 X F2 . IB0001 135.0 0.000 685.0 907.9 10.00 38.90 +IB0009 DEKALB XL71 . IB0001 140.0 0.300 685.0 907.9 10.50 38.90 +IB0010 F478 X W705A . IB0001 140.0 0.000 685.0 907.9 10.00 38.90 +IB0011 DEKALBXL45 . IB0001 150.0 0.400 685.0 907.9 10.15 38.90 +IB0012 PIO 3382 . IB0001 160.0 0.700 950.0 845.0 8.40 38.90 +IB0013 B59*OH43 . IB0001 162.0 0.800 685.0 862.4 6.90 38.90 +IB0014 F16 X F19 . IB0001 165.0 0.000 685.0 907.9 10.00 38.90 +IB0015 WASHINGTON . IB0001 165.0 0.400 715.0 825.0 11.00 38.90 +IB0016 B14XOH43 . IB0001 172.0 0.300 685.0 907.9 8.50 38.90 +IB0017 R1*(N32*B14) . IB0001 172.0 0.800 685.0 907.9 10.15 38.90 +IB0018 B60*R71 . IB0001 172.0 0.800 685.0 781.4 7.70 38.90 +IB0019 WF9*B37 . IB0001 172.0 0.800 685.0 907.9 10.15 38.90 +IB0020 B59*C103 . IB0001 172.0 0.800 685.0 907.9 10.15 38.90 +IB0021 Garst 8702 . IB0001 175.0 0.200 960.0 855.8 6.00 38.90 +IB0022 B14*C103 . IB0001 180.0 0.500 685.0 907.9 10.15 38.90 +IB0023 B14*C131A . IB0001 180.0 0.500 685.0 907.9 10.15 38.90 +IB0024 PIO 3720 . IB0001 180.0 0.800 685.0 907.9 10.00 38.90 +IB0025 WASH/GRAIN-1 . IB0001 185.0 0.400 775.0 836.0 12.00 38.90 +IB0026 A632 X W117 . IB0001 187.0 0.000 685.0 907.9 10.00 38.90 +IB0027 Garst 8750 . IB0001 190.0 0.200 930.0 891.0 6.30 38.90 +IB0028 TAINAN-11 . IB0001 200.0 0.800 670.0 803.0 6.80 38.90 +IB0029 PIO 3541 . IB0001 200.0 0.300 800.0 770.0 8.50 38.90 +IB0030 PIO 3707 . IB0001 200.0 0.700 800.0 649.0 6.30 38.90 +IB0031 PIO 3475* . IB0001 200.0 0.700 800.0 797.5 8.60 38.90 +IB0032 PIO 3382* . IB0001 200.0 0.700 800.0 715.0 8.50 38.90 +IB0033 PIO 3780 . IB0001 200.0 0.760 685.0 660.0 9.60 38.90 +IB0034 PIO 3780* . IB0001 200.0 0.760 685.0 797.5 9.60 38.90 +IB0035 McCurdy 84aa . IB0001 265.0 0.300 920.0 920.0 8.00 43.00 +IB0036 C281 . IB0001 202.0 0.300 685.0 907.9 5.80 38.90 +IB0037 SWEET CORN . IB0001 210.0 0.520 625.0 907.5 10.00 38.90 +IB0038 Garst 8555 . IB0001 215.0 0.400 890.0 880.0 9.00 38.90 +IB0039 PIO 3901 . IB0001 215.0 0.760 600.0 616.0 9.00 38.90 +IB0040 B8*153R . IB0001 218.0 0.300 760.0 632.5 8.80 38.90 +IB0041 Garst 8808 . IB0001 220.0 0.400 780.0 858.0 8.50 38.90 +IB0042 B73 X MO17 . IB0001 220.0 0.520 880.0 803.0 10.00 38.90 +IB0043 PIO 511A . IB0001 220.0 0.300 685.0 709.5 10.50 38.90 +IB0044 W69A X F546 . IB0001 240.0 0.300 685.0 907.9 10.00 38.90 +IB0045 A632 X VA26 . IB0001 240.0 0.300 685.0 907.9 10.00 38.90 +IB0046 W64A X W117 . IB0001 245.0 0.000 685.0 907.9 8.00 38.90 +IB0047 PIO 3147 . IB0001 255.0 0.760 685.0 917.4 10.00 38.90 +IB0048 WF9*B37 . IB0001 260.0 0.800 710.0 907.9 6.50 38.90 +IB0049 NEB 611 . IB0001 260.0 0.300 720.0 907.5 9.00 38.90 +IB0050 PV82S . IB0001 260.0 0.500 750.0 660.0 8.50 38.90 +IB0051 PV76S . IB0001 260.0 0.500 750.0 660.0 8.50 38.90 +IB0052 PIO 3183 . IB0001 260.0 0.500 750.0 660.0 8.50 38.90 +IB0053 CESDA-28 . IB0001 260.0 0.500 669.0 858.0 7.10 38.90 +IB0054 B14*OH43 . IB0001 265.0 0.800 665.0 858.0 6.90 38.90 +IB0055 MCCURDY 6714 . IB0001 265.0 0.300 825.0 907.9 9.80 38.90 +IB0056 FM 6 . IB0001 276.0 0.520 867.0 677.6 10.70 38.90 +IB0057 TOCORON-3 . IB0001 276.0 0.520 867.0 660.0 8.12 38.90 +IB0058 NC+59 . IB0001 280.0 0.300 750.0 907.5 10.00 38.90 +IB0059 H6 . IB0001 310.0 0.300 685.0 907.9 10.00 38.90 +IB0060 H610(UH) . IB0001 365.0 0.520 850.0 680.0 6.50 38.90 +IB0061 PB 8 . IB0001 300.0 0.520 990.0 440.0 7.00 38.90 +IB0062 B56*C131A . IB0001 318.0 0.500 700.0 885.5 6.40 38.90 +IB0063 PIO X 304C . IB0001 365.0 0.520 920.0 780.0 5.70 38.90 +IB0064 H.OBREGON . IB0001 360.0 0.800 685.0 907.9 10.15 38.90 +IB0065 SUWAN-1 . IB0001 380.0 0.600 780.0 825.0 7.00 38.90 +IB0066 PIO 3165 . IB0001 320.0 0.520 940.0 625.0 6.00 38.90 +IB0067 PIO 3324 . IB0001 320.0 0.520 940.0 625.0 6.00 38.90 +IB0068 PIO 3475 . IB0001 200.0 0.700 750.0 907.0 9.00 38.90 +IB0168 PIO 3475 orig . IB0001 220.0 0.700 850.0 907.0 9.90 38.90 +IB0069 PIO 3790 . IB0001 212.4 0.520 792.8 625.0 6.00 38.90 +IB0070 CARGILL 111S . IB0001 290.0 0.500 1035. 580.0 5.50 47.00 +IB0071 PIO 31G98 . IB0003 165.0 0.750 680.0 820.4 6.60 48.00 +IB0089 GL 582 . IB0001 200.0 0.700 750.0 750.0 8.60 38.90 +IB0090 GL 482 . IB0001 240.0 0.700 990.0 907.0 8.80 38.90 +IB0091 GL 450 . IB0001 200.0 0.700 850.0 700.0 7.00 38.90 +IB0092 LAURENT 3733 . IB0001 200.0 0.700 680.0 725.0 9.00 38.90 +IB0093 GL 582 MOD KBS . IB0001 180.0 0.700 750.0 750.0 8.60 38.90 +IB0099 AGETI76 . IB0001 325.0 2.000 625.0 580.0 7.30 50.00 +IB0100 PARTAP1 . IB0001 450.0 2.000 580.0 600.0 16.50 50.00 + +IB1051 AS 740 . IB0001 215.0 0.750 850.0 700.0 5.00 48.00 +IB1053 LH198XLH185 . IB0001 205.0 0.750 850.0 731.0 5.00 48.00 +IB0154 PIO 3192 . IB0001 215.0 0.300 990.0 660.0 8.50 48.00 +IB0155 DEA . IB0001 165.0 0.100 476.0 442.0 5.35 40.00 + +IB1052 DK 611 . IB0001 260.0 0.100 800.0 980.0 5.70 48.00 + +!Brazil cultivars: +IB0171 AG9010 . IB0001 196.0 0.500 758.0 830.0 5.10 40.00 +IB0172 DAS CO32 . IB0001 220.0 0.500 747.8 1100. 5.40 45.00 +IB0173 DKB 333B . IB0001 250.0 0.500 842.0 920.0 4.80 45.00 +IB0174 EXCELER . IB0001 210.0 0.500 770.0 1170. 5.80 45.00 + +IB0185 JACKSON HYBRI . IB0001 200.0 0.300 950.0 980.0 7.15 43.00 + +IB1065 PIO 33Y09 . IB0001 245.0 0.500 905.0 780.0 6.00 48.00 +IB1066 PIO 3489 . IB0001 225.0 0.600 895.0 875.0 8.80 48.00 +IB1067 PIO 3394 . IB0001 240.0 0.500 900.0 820.0 8.50 48.00 +IB1069 PIO 3563 . IB0001 216.0 0.600 830.0 860.0 8.80 48.00 +IB1072 DEKALB 485 . IB0001 215.0 0.600 785.0 750.0 8.70 45.00 +IB1068 DEKALB 521 . IB0001 215.0 0.400 795.0 890.0 8.00 48.00 +IB1168 DEKALB 591 . IB0001 225.0 0.400 895.0 880.0 8.00 48.00 + +LL0499 C/LOL 499 . IB0001 182.0 0.500 650.0 750.0 8.70 46.00 +LL0564 C/LOL 564 . IB0001 210.0 0.500 670.0 880.0 11.25 46.00 +LL0581 C/LOL 581 . IB0001 200.0 0.500 668.0 850.0 8.80 45.00 +LL0599 C/LOL 599 . IB0001 200.0 0.500 670.0 850.0 8.80 45.00 +LL0542 C/LOL 542 . IB0001 185.0 0.500 700.0 835.0 8.70 46.00 +LL0661 C/LOL 661 . IB0001 200.0 0.500 670.0 850.0 9.00 45.00 +LL0674 C/LOL 674 . IB0001 200.0 0.500 670.0 800.0 8.90 45.00 + +ZA0001 Prisma (FAO 700) . IB0001 280.0 0.400 850.0 750.0 6.80 38.90 +ZA0002 Prisma GC Avg . IB0001 280.0 0.300 789.0 700.0 6.05 48.00 + +IF0001 OBA SUPER 2 . IB0001 270.0 0.600 780.0 840.0 7.80 45.00 +IF0002 EV8728-SR . IB0001 265.0 0.600 800.0 900.0 7.20 45.00 +IF0003 Mokwa 87TZPB-SR . IB0001 305.0 0.600 765.0 810.0 8.00 45.00 +IF0004 SPL (semi-prol) . IB0001 270.0 0.600 740.0 920.0 7.40 41.00 +IF0005 TZB-SR (open p) . IB0001 290.0 0.600 775.0 990.0 6.80 45.00 +IF0006 EV 8449-SR . IB0001 385.0 0.600 860.0 700.0 8.00 50.00 +IF0007 EV 8449-SRx . IB0001 385.0 0.600 860.0 945.4 7.20 50.00 +IF0008 AG-KADUNA . IB0001 220.0 0.600 780.0 845.0 8.00 40.00 +IF0009 OBA S2 Benin . IB0001 170.0 0.600 760.0 800.0 8.00 50.00 +IF0010 EV-8449_TG . IB0001 260.0 0.600 630.0 900.0 9.00 45.00 +IF0011 EV-8443_TG . IB0001 300.0 0.600 850.0 850.0 8.80 45.00 + +AC0001 TOHONO O'odham . IB0001 200.0 0.100 610.0 248.0 9.80 38.90 !Michael Pool, Austin Comm College + +! Vietnam sequencing +VI0001 LVN 10 . IB0001 350.0 1.000 980.0 760.0 9.20 38.90 + +!Coefficients calibrated by Jones and Boote in Mali +IM0001 SOTUBAKA . IB0001 300.0 0.520 930.0 500.0 6.00 38.90 +IM0002 NIELENI . IB0001 232.0 0.300 688.0 540.0 8.80 38.90 +IM0003 APPOLO . IB0001 216.0 0.300 530.0 455.0 11.00 38.90 + +!Coefficients calibrated by Dzotsi and Singh in Togo, 2002. +IF0018 TZE C0MP4C2 . IB0001 210.0 0.100 660.0 850.0 9.70 55.00 +IF0019 TZESRW X GUA 314 . IB0001 170.0 0.100 660.0 780.0 8.00 55.00 +IF0020 AB-11-TG . IB0001 250.0 0.100 620.0 920.0 8.50 55.00 +IF0021 TZEEY-SRBC5 . IB0001 130.0 0.100 600.0 850.0 8.00 55.00 +IF0022 IKENNE . IB0001 280.0 0.600 630.0 900.0 8.80 45.00 + +!Alagarswamy +IB0067 TEST . IB0001 130.0 0.500 720.0 380.0 7.50 75.00 +KA0001 H625 . IB0001 130.0 0.500 720.0 380.0 7.50 75.00 +EM0001 H512 . IB0001 130.0 0.500 720 0 550.0 7.50 75.00 +KY0001 H622 . IB0001 358.5 0.500 616.1 550.0 7.20 75.00 +KY0002 H511 . IB0001 317.6 0.500 530.4 550.0 7.50 75.00 +KY0003 CCOMP . IB0001 366.2 1.235 611.3 600.0 6.50 75.00 +KY0004 MAKUCOMP . IB0001 183.6 0.500 611.0 380.0 10.00 75.00 +KY0005 H625 . IB0001 341.1 0.500 612.0 700.0 8.50 75.00 +KY0006 KCB . IB0001 125.0 0.500 500.3 450.0 10.50 75.00 +KY0007 PWANI . IB0001 182.4 0.500 616.0 720.0 10.50 75.00 +KY0008 H613 . IB0001 182.4 0.500 616.0 825.0 10.15 75.00 +KY0009 CUZCO . IB0001 182.4 0.500 616.0 380.0 7.50 75.00 +KY0010 H512 . IB0001 332.9 0.500 601.6 550.0 7.50 75.00 +KY0011 H614 . IB0001 396.9 0.500 623.6 825.0 10.15 75.00 +KY0012 H5012 . IB0001 351.7 0.500 859.0 550.0 7.50 75.00 +KY0013 H626 . IB0001 458.0 0.500 429.0 450.0 10.50 75.00 +KY0014 KATUMANICOMPI . IB0001 238.6 0.500 654.0 450.0 10.50 75.00 +KY0015 PH 1 . IB0001 234.5 0.500 429.0 720.0 10.50 75.00 +KY0016 HAC . IB0001 245.0 0.500 825.0 750.0 10.50 75.00 +KY0017 H612 . IB0001 130.0 0.500 390.0 825.0 10.15 75.00 +KY0018 KATUMANICOMP-II . IB0001 125.0 0.500 660.0 450.0 10.50 75.00 + +!J.B.Naab data 2003-2006, re-calibrated by kjb 1/2/12 +GH0010 OBATAMPA . IB0001 280.0 0.000 750.0 540.0 7.50 40.00 + +!Four Global Futures maize cultivars (3 life cycle by 2 "yield levels") +!Composite: same maturity as Garst 8808 and WH403), but G2 and G3 mid-way. +!Those cultivars seemed most realistic compared with 5 other cultivars calibrated +!in DSSAT, not too early (Pio3382 too early), not too late (Pio 304C is late), +!not too high in yield(McCurdy 84aa not realistic), DK611 strange, and +!Obatanpa is low yielding (fertility constraints, or OPV) +!Yield "trait" is 5% higher RUE, 5% higher G2, 5% higher G3 + +GF0001 Base Garst808-wh403 . IB0001 250.0 0.500 730.0 800.0 7.80 38.90 +GF0101 Baseline 10%shorter . IB0001 215.0 0.500 650.0 800.0 7.80 38.90 +GF0201 Baseline 10%longer . IB0001 285.0 0.500 810.0 800.0 7.80 38.90 +GF0301 Yield norm cycle . IB0004 250.0 0.500 730.0 840.0 8.19 38.90 +GF0401 Yield 10%shorter . IB0004 215.0 0.500 650.0 840.0 8.19 38.90 +GF0501 Yield 10%longer . IB0004 285.0 0.500 810.0 840.0 8.19 38.90 + +CYMA01 wh403 . IB0001 265.0 0.760 685.0 760.0 7.60 38.90 + +! Added by Camilo Andrade from Embrapa Maize and Sorghum +EBSL06 BRS1030-SL2009 . IB0001 263.8 0.500 1034 700.0 5.20 44.22 !Single-cross hybrid from Embrapa diff --git a/lib/maize/MZCER047.ECO b/lib/maize/MZCER047.ECO new file mode 100644 index 0000000..dbbf965 --- /dev/null +++ b/lib/maize/MZCER047.ECO @@ -0,0 +1,29 @@ +*MAIZE ECOTYPE COEFFICIENTS: MZCER047 MODEL +! +! COEFF DEFINITIONS +! ===== =========== +! ECO# Code for the ecotype to which a cultivar belongs (see *.cul +! file) +! ECONAME Name of the ecotype, which is referenced from *.CUL file +! TBASE Base temperature below which no development occurs, C +! TOPT Temperature at which maximum development rate occurs during vegetative stages, C +! ROPT Temperature at which maximum development rate occurs for reproductive stages, C +! P2O Daylength below which daylength does not affect development rate, hours +! DJTI Minimum days from end of juvenile stage to tassel initiation if the cultivar +! is not photoperiod sensitive, days +! GDDE Growing degree days per cm seed depth required for emergence, GDD/cm +! DSGFT GDD from silking to effective grain filling period, C +! RUE Radiation use efficiency, g plant dry matter/MJ PAR +! KCAN Canopy light extinction coefficient for daily PAR. +! TSEN Critical temperature below which leaf damage occurs (default 6°C) +! CDAY Number of cold days parameter (default 15.0 ) +@ECO# ECONAME......... TBASE TOPT ROPT P20 DJTI GDDE DSGFT RUE KCAN TSEN CDAY +! 1 2 3 4 5 6 7 8 9 10 11 +IB0001 GENERIC MIDWEST1 8.0 34.0 34.0 12.5 4.0 6.0 170. 4.2 0.85 +IB0002 GENERIC MIDWEST2 8.0 34.0 34.0 12.5 4.0 6.0 170. 4.5 0.85 +IB0003 GENERIC MIDWEST3 8.0 34.0 34.0 12.5 4.0 6.0 170. 2.0 0.85 +IB0004 +5% RUE MIDWEST1 8.0 34.0 34.0 12.5 4.0 6.0 170. 4.4 0.85 +DFAULT DEFAULT 8.0 34.0 34.0 12.5 4.0 6.0 170. 4.2 0.85 + + + diff --git a/lib/maize/MZCER047.SPE b/lib/maize/MZCER047.SPE new file mode 100644 index 0000000..373ae0d --- /dev/null +++ b/lib/maize/MZCER047.SPE @@ -0,0 +1,87 @@ +*MAIZE SPECIES COEFFICIENTS: MZCER047 MODEL + +*TEMPERATURE EFFECTS +! TBASE TOP1 TOP2 TMAX + PRFTC 6.2 16.5 33.0 44.0 !Effect of temperature on photosynthesis +! RGFIL 5.5 16.0 29.0 37.0 !Effect of temperature on relative grain filling rate (tolerant) + RGFIL 5.5 16.0 27.0 35.0 !Effect of temperature on relative grain filling rate (suscept) + +*PHOTOSYNTHESIS PARAMETERS + PARSR 0.50 !Conversion of solar radiation to PAR + CO2X 0 220 280 330 400 490 570 750 990 9999 + CO2Y 0.00 0.85 0.95 1.00 1.02 1.04 1.05 1.06 1.07 1.08 + +*STRESS RESPONSE + FSLFW 0.050 !Fraction of leaf area senesced under 100% water stress, 1/day + FSLFN 0.050 !Fraction of leaf area senesced under 100% nitrogen stress, 1/day + FSLFP 0.050 !Fraction of leaf area senesced under 100% phosphorus stress, 1/day + +*SEED GROWTH PARAMETERS + SDSZ .2750 !Maximum potential seed size, mg/sd + RSGR 0.1 !Relative seed growth rate below which plant may mature early + RSGRT 5.0 !Number of consecutive days relative seed growth rate is below RSGR that triggers early maturity + CARBOT 7.0 !Number of consecutive days CARBO is less than .001 before plant matures due to temperature, water or nitrogen stress + DSGT 21.0 !Maximum days from sowing to germination before seed dies. + DGET 150.0 !Growing degree days between germination and emergence after which the seed dies due to drought + SWCG 0.02 !Minimimum available soil water required for seed germination, cm3/cm3 + +*EMERGENCE INITIAL CONDITIONS + STMWTE 0.20 !Stem weight at emergence, g/plant + RTWTE 0.20 !Root weight at emergence, g/plant + LFWTE 0.20 !Leaf weight at emergence, g/plant + SEEDRVE 0.20 !Carbohydrate reserve in seed at emergence, g/plant + LEAFNOE 1.0 !Leaf number at emergence, #/plant + PLAE 1.0 !Leaf area at emergence, cm2/plant + +*NITROGEN PARAMETERS + TMNC 0.00450 !Plant top minimum N concentration g N/g dry matter (orig) + TANCE 0.0440 !Nitrogen content in above ground biomass at emergence, g N/g dry matter + RCNP 0.01060 !Root critical nitrogen concentration, g N/g root dry weight + RANCE 0.0220 !Root N content at emergence g N/g root + CTCNP1 1.52 !Maximum value for critical tissue N concentration (in developing seed embryo) + CTCNP2 0.160 !Coefficent for change in conc. with growth stage + +*ROOT PARAMETERS + PORM 0.05 !Minimum volume required for supplying oxygen to roots for optimum growth (1-1.0) + RWMX 0.03 !Not used in ceres, but passed through AltPlant for use elsewhere + RLWR 0.98 !Root length to weight ratio (cm/g * 1E-4) + RWUEP1 1.50 + +*PLANT COMPOSITION VALUES + PLIGLF 0.070 !Leaf lignin fraction + PLIGST 0.070 !Stem lignin fraction + PLIGRT 0.070 !Root lignin fraction + PLIGSH 0.280 !Shell lignin fraction + PLIGSD 0.020 !Seed lignin fraction + +*PHOSPHORUS CONTENT (g [P]/g [shoot]) + 0.0070 0.0025 0.0020 Optimum Shoot Conc (emerg, End L. Growth, p. mat) + -99.0 -99.0 -99.0 Optimum Leaf Conc ( " " " ) + -99.0 -99.0 -99.0 Optimum Stem Conc ( " " " ) + .00041 .00041 .00041 Optimum Root Conc ( " " " ) + 0.0050 0.0050 0.0005 Optimum Shell Conc ( " " " ) + 0.0035 0.0035 0.0035 Optimum Seed Conc ( " " " ) + + 0.0040 0.0015 0.0010 Minimum Shoot Conc (emerg, End L. Growth, p. mat) + -99.0 -99.0 -99.0 Minimum Leaf Conc ( " " " ) + -99.0 -99.0 -99.0 Minimum Stem Conc ( " " " ) + .00020 .00020 .00020 Minimum Root Conc ( " " " ) + 0.0025 0.0025 .00025 Minimum Shell Conc ( " " " ) + .00175 .00175 .00175 Minimum Seed Conc ( " " " ) + + 25.0 15.0 9.3 Maximum Veg N:P ratio (emergence, eff. grain fill, phys. mat) + 4.2 2.7 2.1 Minimum Veg N:P ratio (emergence, eff. grain fill, phys. mat) + + 0.80 1.00 SRATPHOTO, SRATPART + 0.10 FracPMobil - max fraction of P which can be mobilized from leaf & stem / day + 0.0028 ROOTRAD - radius of cylinder around roots from which soil P can be extracted (m) + +!At emergence and end of leaf growth: +!Optimum shoot P concentration (%) = 0.684 - 0.108X (Jones, 1983) +!At physiological maturity: +!Optimum shoot P concentration (%) = 0.238 - 0.0056X (Jones, 1983) +!Where: +!X is the growth stage. +!Emergence was defined as growth stage 0 (X = 0), end of leaf growth as growth stage 4, and +!physiological maturity as growth stage 10 (Jones, 1983). Minimum shoot P concentration was +!taken as 60% of the estimated optimum (Daroub et al., 2003). diff --git a/lib/maize/execute.py b/lib/maize/execute.py new file mode 100644 index 0000000..11d91eb --- /dev/null +++ b/lib/maize/execute.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python +from datetime import datetime, timedelta +from collections import defaultdict +import numpy as np +import mz, json, argparse + + +# def generate_DSSAT_config(var_num, var_name, eco_num, p1, p2, p5, g2, g3, phint): + + +#! DAYL Day length on day of simulation (from sunrise to sunset) (hr) +#! DLAYR(L) Soil thickness in layer L (cm) +#! LEAFNO Number of oldest leaf per plant +#! LL(NL) Soil water lower limit, cm3/cm3 +#! NLAYR Number of soil layers +#! PLTPOP Plant population, no./m2 +#! SDEPTH Sowing depth, cm +#! SI1(6) Water stress during a growth stage used for output +#! SI3(6) Water stress during a growth stage used for output +#! SNOW = Snow depth, mm +#! SRAD Daily solar radiation, MJ/m2/day +#! SUMP Cumulative plant growth during ISTAGE 4, g/plant +#! SW(NL) Soil water content in layer, cm3/cm3 +#! TMAX Daily maximum temperature, C +#! TMIN Daily minimum temperature, C +#! TWILEN Twilight definition of daylength +#! XN Number of oldest expanding leaf +#! YRDOY Year and day of year +#! YRSIM Year and day of year of first day of simulation + +def execute(config, json_parameter_file, output_csv_name): + refyear = "2021" + with open(json_parameter_file) as f: + params = json.load(f) + + plantdate = int(params["plantdate"]) + tmins = params["tmins"] + tmaxs = params["tmaxs"] + srads = params["srads"] + rains = params["rains"] + + freedom_units = params["units"] == "F" + + ##INIT + DAYL = 12. + DLAYR = 10. + LEAFNO = 20. + LL = 0.3 + NLAYR = 1. + PLTPOP = 5 + SDEPTH = 10. + SNOW = 0 + SUMP = 0 # we should use the plant growth value replace it + SW =2. + TWILEN =10 + TWILEN =8 + XN =20 + YRSIM = int(f"{refyear}001") + # output + EARS=0 + GPP=0 + ISDATE=0 + MDATE=0 + DTT = np.zeros(1) + CUMDTT = np.zeros(1) + SUMDTT = np.zeros(1) + P3 = np.zeros(1) + STGDOY = np.zeros(20,dtype=np.int32) + ISTAGE = np.zeros(1, dtype=np.int32) + ISTAGE[0] = 7 # begin with 7 + YREMRG = np.zeros(1, dtype=np.int32) + CDAY = np.zeros(1, dtype=np.int32) + + XNTI=0 + TLNO=0 + XSTAGE=0 + RUE=0 + KCAN=0 + KEP=0 + TSEN=0 + CDAY=0 + SeedFrac=0 + VegFrac=0 + + gdd=0 + + INIT = True + yrdoy = 1 + df_out = defaultdict(list) + + for tmin, tmax, srad, rain in zip(tmins, tmaxs, srads, rains): + doy = yrdoy + yrdoy += 1 + if doy<plantdate: + continue + if INIT: + dynamic = 1 + INIT = False + else: + dynamic = -1 + + YRDOY = f"{str(refyear)[-2:]}{str(yrdoy).rjust(3, '0')}" + SRAD = float(srad) + TMAX = float(tmax) + TMIN = float(tmin) + RAIN = float(rain) + + if freedom_units: + TMAX = (TMAX - 32) * (5/9) + TMIN = (TMIN - 32) * (5/9) + + + mz.mz_phenol(config, dynamic, # !C + DAYL,DLAYR,LEAFNO,LL,NLAYR, # !I + SNOW, SRAD,SUMP,SW,TMAX,TMIN, TWILEN, # !I + XN,YRDOY,YRSIM, # !I + CUMDTT,DTT,EARS,GPP,ISDATE, ISTAGE,MDATE,STGDOY,SUMDTT,# !O + XNTI,TLNO,XSTAGE,YREMRG,RUE,KCAN,KEP, P3, TSEN, CDAY, # !O + SeedFrac, VegFrac) + # !O + YRDOY = f"{refyear}{doy:03d}" + + df_out["DTT"].append(DTT[0]) + gdd = gdd+DTT[0] + df_out["GDD"].append(gdd) + df_out["SUMDTT"].append(SUMDTT[0]) + df_out["ISTAGE"].append(ISTAGE[0]) + df_out["YRDOY"].append(YRDOY) + + # df_out = pd.DataFrame.from_dict(df_out) + # df_out.set_index("YRDOY").to_csv(output_csv_name) + +def get_predicted_harvest(config, json_parameter_file): + refyear = "2021" + with open(json_parameter_file) as f: + params = json.load(f) + + plantdate = int(params["plant_date"]) + tmins = params["tmins"] + tmaxs = params["tmaxs"] + srads = params["srads"] + # rains = params["rains"] + + freedom_units = params["units"] == "F" + + ##INIT + DAYL = 12. + DLAYR = 10. + LEAFNO = 20. + LL = 0.3 + NLAYR = 1. + PLTPOP = 5 + SDEPTH = 10. + SNOW = 0 + SUMP = 0 # we should use the plant growth value replace it + SW =2. + TWILEN =10 + TWILEN =8 + XN =20 + YRSIM = int(f"{refyear}001") + # output + EARS=0 + GPP=0 + ISDATE=0 + MDATE=0 + DTT = np.zeros(1) + CUMDTT = np.zeros(1) + SUMDTT = np.zeros(1) + P3 = np.zeros(1) + STGDOY = np.zeros(20,dtype=np.int32) + ISTAGE = np.zeros(1, dtype=np.int32) + ISTAGE[0] = 7 # begin with 7 + YREMRG = np.zeros(1, dtype=np.int32) + CDAY = np.zeros(1, dtype=np.int32) + + XNTI=0 + TLNO=0 + XSTAGE=0 + RUE=0 + KCAN=0 + KEP=0 + TSEN=0 + CDAY=0 + SeedFrac=0 + VegFrac=0 + + gdd=0 + + INIT = True + yrdoy = 1 + df_out = defaultdict(list) + + for tmin, tmax, srad in zip(tmins, tmaxs, srads): + doy = yrdoy + yrdoy += 1 + if doy<plantdate: + continue + if INIT: + dynamic = 1 + INIT = False + else: + dynamic = -1 + + YRDOY = f"{str(refyear)[-2:]}{str(yrdoy).rjust(3, '0')}" + SRAD = float(srad) + TMAX = float(tmax) + TMIN = float(tmin) + # RAIN = float(rain) + + if freedom_units: + TMAX = (TMAX - 32) * (5/9) + TMIN = (TMIN - 32) * (5/9) + + + mz.mz_phenol(config, dynamic, # !C + DAYL,DLAYR,LEAFNO,LL,NLAYR, # !I + SNOW, SRAD,SUMP,SW,TMAX,TMIN, TWILEN, # !I + XN,YRDOY,YRSIM, # !I + CUMDTT,DTT,EARS,GPP,ISDATE, ISTAGE,MDATE,STGDOY,SUMDTT,# !O + XNTI,TLNO,XSTAGE,YREMRG,RUE,KCAN,KEP, P3, TSEN, CDAY, # !O + SeedFrac, VegFrac) + # !O + YRDOY = f"{refyear}{doy:03d}" + + if ISTAGE[0] == 6: + return YRDOY + + return -1 + + +# execute("test.json", "data.csv") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Process some integers.') + parser.add_argument('--config', help='DSSAT config file') + parser.add_argument('--input', help='input json file') + parser.add_argument('--output', help='output csv file') + parser.add_argument('--predicted', action='store_true') + args = parser.parse_args() + if args.predicted: + print (get_predicted_harvest(int(args.config), args.input)) + else: + execute(int(args.config), args.input, args.output) \ No newline at end of file diff --git a/lib/maize/mz.cpython-38-x86_64-linux-gnu.so b/lib/maize/mz.cpython-38-x86_64-linux-gnu.so new file mode 100644 index 0000000000000000000000000000000000000000..6a4349edb938551a0e701aea2d0622ab1739e350 GIT binary patch literal 238632 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�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�xpcHI*;t{JLq>MbPYc7a0)g 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 F`2&6>%r*c3 literal 0 HcmV?d00001 diff --git a/lib/maize/mz.f b/lib/maize/mz.f new file mode 100644 index 0000000..f4e3922 --- /dev/null +++ b/lib/maize/mz.f @@ -0,0 +1,1209 @@ +!====================================================================== +! MZ_PHENOL, Subroutine +! +! Determines Phenological Stage and Growing Degree Days for Maize +!---------------------------------------------------------------------- +! Revision history +! +! Written +! 02/07/1993 PWW Header revision and minor changes +! 02/07/1993 PWW Added switch block, code cleanup +! 02/07/1993 PWW Modified TT calculations to reduce line #'s +! 05/ /1994 WTB Modified for MILLET model +! 03/29/2001 WDB Converted to modular format +! 12/01/2001 WDB Major restructuring for 2002 release +! 06/11/2002 GH Modified for Y2K +! 08/12/2003 CHP Added I/O error checking +! 10/12/2005 CHP/JIL Added optional temperature sensitivity parameter +! to ecotype file (TSEN) +! 07/13/2006 CHP Added P model +!---------------------------------------------------------------------- + +! DAYL Day length on day of simulation (from sunrise to sunset) (hr) +! DLAYR(L) Soil thickness in layer L (cm) +! LEAFNO Number of oldest leaf per plant +! LL(NL) Soil water lower limit, cm3/cm3 +! NLAYR Number of soil layers +! PLTPOP Plant population, no./m2 +! SDEPTH Sowing depth, cm +! SI1(6) Water stress during a growth stage used for output +! SI3(6) Water stress during a growth stage used for output +! SNOW = Snow depth, mm +! SRAD Daily solar radiation, MJ/m2/day +! SUMP Cumulative plant growth during ISTAGE 4, g/plant +! SW(NL) Soil water content in layer, cm3/cm3 +! TMAX Daily maximum temperature, C +! TMIN Daily minimum temperature, C +! TWILEN Twilight definition of daylength +! XN Number of oldest expanding leaf +! YRDOY Year and day of year +! YRSIM Year and day of year of first day of simulation + + CHARACTER*1 FUNCTION UPCASE (INCHAR) + + IMPLICIT NONE + + CHARACTER INCHAR*1 + INTEGER CHAVAL + + CHAVAL = ICHAR(INCHAR) + + IF ((CHAVAL .LE. 122) .AND. (CHAVAL .GE. 97)) THEN + UPCASE = CHAR(CHAVAL-32) + ELSE + UPCASE = INCHAR + ENDIF + + END FUNCTION UPCASE + + + + + SUBROUTINE IGNORE(LUN,LINEXP,ISECT,CHARTEST) + + CHARACTER BLANK*(80),CHARTEST*(*) + INTEGER LENGTH, LUN,LINEXP,ISECT + DATA BLANK/' '/ + + LENGTH = LEN(CHARTEST) + + ISECT = 1 + 30 READ(LUN,'(A)',ERR=70, END=70)CHARTEST + LINEXP = LINEXP + 1 + +! CHP 5/1/08 + IF (CHARTEST(1:1) == CHAR(26)) THEN + GO TO 70 + ENDIF + +C Check to see if all of this section has been read + IF(CHARTEST(1:1) .EQ. '*' .OR. CHARTEST(1:1) .EQ. '$') THEN +C End of section encountered + ISECT = 2 + RETURN + ENDIF +C +C Check for blank lines and comments (denoted by ! in column 1) + IF(CHARTEST(1:1).NE.'!' .AND. CHARTEST(1:1).NE.'@') THEN +! IF(CHARTEST(1:80).NE.BLANK)THEN + IF(CHARTEST(1:LENGTH).NE.BLANK)THEN +C FOUND A GOOD LINE TO READ + RETURN + ENDIF + ENDIF + + GO TO 30 +C To read the next line + + 70 ISECT = 0 + RETURN + END SUBROUTINE IGNORE + + + SUBROUTINE FIND(LUNUM,NAME,LNUM,FOUND) + + IMPLICIT NONE + INTEGER FOUND,I,LNUM,LUNUM + CHARACTER SECTION*6,NAME*6,UPCASE*1 +C +C Initialization. +C + FOUND = 0 + LNUM = 1 + DO I = 1, LEN(NAME) + NAME(I:I) = UPCASE(NAME(I:I)) + END DO +C +C Loop to read through data file. +C + 10 IF (.TRUE.) THEN + READ(LUNUM,'(A)',END=20) SECTION + DO I = 1,LEN(SECTION) + SECTION(I:I) = UPCASE(SECTION(I:I)) + END DO +C +C String found, set FOUND to 1, and exit loop. +C + IF (NAME .EQ. SECTION) then + FOUND = 1 + GOTO 20 +C +C String not found, set FOUND to 0. +C + ELSE + FOUND = 0 + ENDIF + + LNUM = LNUM + 1 + GOTO 10 + ENDIF + + 20 RETURN + END + + + SUBROUTINE MZ_PHENOL(FILEID, DYNAMIC, + & DAYL,DLAYR,LEAFNO,LL,NLAYR, + & SNOW, SRAD,SUMP,SW,TMAX,TMIN, TWILEN, + & XN,YRDOY,YRSIM, + & CUMDTT,DTT,EARS,GPP,ISDATE, ISTAGE,MDATE,STGDOY,SUMDTT, + & XNTI,TLNO,XSTAGE,YREMRG,RUE,KCAN,KEP, P3, TSEN, CDAY, + & SeedFrac, VegFrac) + + !USE ModuleDefs + IMPLICIT NONE + SAVE + INTEGER,PARAMETER :: NL=1 + CHARACTER*1,PARAMETER :: ISWWAT ="Y" + CHARACTER*30 :: FILEIO + CHARACTER*1,PARAMETER :: IDETO ="Y" + REAL,PARAMETER:: SI1(6) = (/0.1,0.1,0.1,0.1,0.1,0.1/) + REAL,PARAMETER:: SI3(6) = (/0.1,0.1,0.1,0.1,0.1,0.1/) +!---------------------------------------------------------------------- +! Define Variables +!---------------------------------------------------------------------- + INTEGER DYNAMIC + +! REAL ABSTRES + REAL ACOEF + REAL BARFAC + CHARACTER*1 BLANK + REAL C1 + REAL CUMDEP + REAL,intent(inout) :: P3 +Cf2py intent(inout) P3 + REAL,intent(inout) :: DTT +Cf2py intent(inout) DTT + REAL,intent(inout) :: CUMDTT +Cf2py intent(inout) CUMDTT + REAL,intent(inout) :: SUMDTT +Cf2py intent(inout) SUMDTT + INTEGER,intent(inout):: ISTAGE +Cf2py intent(inout) ISTAGE + INTEGER,intent(inout):: YREMRG +Cf2py intent(inout) YREMRG + INTEGER,intent(inout):: STGDOY(20) +Cf2py intent(inout) STGDOY + INTEGER,intent(inout):: CDAY +Cf2py intent(inout) CDAY + REAL DAYL + REAL DEC + REAL DGET + REAL DJTI + REAL DLAYR(NL) + REAL DLV + REAL DOPT + REAL DSGT + REAL DSGFT + REAL DUMMY + REAL EARS + CHARACTER*6 ECONO + INTEGER ERR + CHARACTER*6 ERRKEY + PARAMETER (ERRKEY='MZPHEN') + INTEGER ERRNUM + CHARACTER*12 FILEC + CHARACTER*12 FILES + CHARACTER*12 FILEE + INTEGER FILEID + CHARACTER*92 FILEGC + INTEGER FOUND + REAL G2 + REAL G3 + REAL GDDE + REAL GPP + INTEGER I + INTEGER IDURP + REAL KCAN + REAL KEP + INTEGER LEAFNO + INTEGER L + INTEGER L0 + INTEGER LINC + REAL LL(NL) + INTEGER LNUM + INTEGER LUNIO + INTEGER MDATE + INTEGER NDAS + INTEGER NLAYR + INTEGER NOUTDO + REAL P1 + REAL P2 + REAL P2O + REAL P5 + REAL P9 + CHARACTER*80 PATHCR + CHARACTER*80 PATHSR + CHARACTER*80 PATHER + REAL PDTT + REAL PHINT + REAL PLTPOP + REAL PSKER + REAL RATEIN + REAL ROPT + REAL RUE + REAL SDEPTH + CHARACTER*6 SECTION + REAL S1 + REAL SIND + REAL SNDN + REAL SNOW + REAL SNUP + REAL SRAD + REAL SUMDTT_2 !introduced for plant P routine + REAL SUMP + REAL SW(NL) + REAL SWCG + REAL SWSD + REAL TBASE + REAL TDSOIL + REAL TEMPCN + + REAL TEMPCR + REAL TEMPCX + REAL TH + REAL TLNO + REAL TMAX + REAL TMIN + REAL TMSOIL + REAL TNSOIL + REAL TOPT + REAL TSEN !10/12/2005 chp + REAL TWILEN + CHARACTER*6 VARNO + CHARACTER*16 VRNAME + REAL XN + REAL XNTI + REAL XS + REAL XSTAGE + INTEGER YRDOY + INTEGER YRSIM + INTEGER ISDATE + + INTEGER PATHL + PARAMETER (BLANK = ' ') + INTEGER LUNECO + + CHARACTER*6 ECOTYP + INTEGER ISECT + CHARACTER*255 C255 + CHARACTER*16 ECONAM + INTEGER LUNCRP + CHARACTER*92 FILECC + CHARACTER*80 C80 + CHARACTER*78 MESSAGE(10) + +! CHP added for P model + REAL SeedFrac, VegFrac + + INTEGER,PARAMETER :: RUNINIT=1 + WRITE (FILEIO, "(A5, I2,A4)") "DSSAT", FILEID, ".INP" +!---------------------------------------------------------------------- +! DYNAMIC = RUNINIT OR DYNAMIC = SEASINIT +! --------------------------------------------------------------------- +! IF (DYNAMIC.EQ.RUNINIT .OR. DYNAMIC.EQ.SEASINIT) THEN + IF (DYNAMIC.EQ.RUNINIT ) THEN + +! Do this just once in RUNINIT + IF (DYNAMIC .EQ. RUNINIT) THEN + !CALL GETLUN('OUTO', NOUTDO) + NOUTDO = 20 + + !------------------------------------------------------- + ! Read input file name (ie. DSSAT45.INP) and path + !------------------------------------------------------- + !CALL GETLUN('FILEIO', LUNIO) + LUNIO = 21 + + OPEN (LUNIO, FILE = FILEIO,STATUS = 'OLD',IOSTAT=ERR) + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILEIO,0) + print*,"A5" + STOP + endif + + READ(LUNIO,50,IOSTAT=ERR) FILES, PATHSR; LNUM = 7 + 50 FORMAT(//////,15X,A12,1X,A80) + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILEIO,LNUM) + print*,"A2" + STOP + endif + + READ(LUNIO,51,IOSTAT=ERR) FILEE, PATHER; LNUM = LNUM + 1 + IF (ERR .NE. 0) then !CALL ERROR(ERRKEY,ERR,FILEIO,LNUM) + print*,"A3" + STOP + endif + 51 FORMAT(15X,A12,1X,A80) + + READ(LUNIO,51,IOSTAT=ERR) FILEC, PATHCR; LNUM = LNUM + 1 + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILEIO,LNUM) + print*,"A4" + STOP + endif + + !------------------------------------------------------ + ! Read Planting Details Section + !------------------------------------------------------ + SECTION = '*PLANT' + CALL FIND(LUNIO, SECTION, LINC, FOUND) ; LNUM = LNUM + LINC + IF (FOUND .EQ. 0) THEN + !CALL ERROR(SECTION, 42, FILEIO, LNUM) + print*,"A2" + STOP + ELSE +! READ(LUNIO,60,IOSTAT=ERR) PLTPOP,SDEPTH + READ(LUNIO,60,IOSTAT=ERR) YREMRG,PLTPOP,SDEPTH + LNUM = LNUM + 1 +! 60 FORMAT(25X,F5.2,25X,F5.2) + 60 FORMAT(11X,I7,7X,F5.2,25X,F5.2) + IF (ERR .NE. 0) THEN!CALL ERROR(ERRKEY,ERR,FILEIO,LNUM) + print*,"A3" + STOP + endif + ENDIF +! ----------------------------------------------------------------- +! Read crop cultivar coefficients +! ----------------------------------------------------------------- + SECTION = '*CULTI' + CALL FIND(LUNIO, SECTION, LINC, FOUND) ; LNUM = LNUM + LINC + IF (FOUND .EQ. 0) THEN + !CALL ERROR(SECTION, 42, FILEIO, LNUM) + print*,"A5" + STOP + ELSE + READ (LUNIO,1800,IOSTAT=ERR) VARNO,VRNAME,ECONO, + % P1,P2,P5,G2,G3,PHINT ; LNUM = LNUM + 1 + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILEIO,LNUM) + print*,"A5" + STOP + endif +1800 FORMAT (A6,1X,A16,1X,A6,1X,6F6.0) + ENDIF + CLOSE(LUNIO) + +! ----------------------------------------------------------------- +! Read Species Coefficients +! ----------------------------------------------------------------- + + FILECC = TRIM(PATHSR) // FILES + !FILECC = "COGRO047.SPE" + !CALL GETLUN('FILEC', LUNCRP) + LUNCRP = 16 + OPEN (LUNCRP,FILE = FILECC, STATUS = 'OLD',IOSTAT=ERR) + IF (ERR .NE. 0) THEN!CALL ERROR(ERRKEY,ERR,FILECC,0) + print*,"A6" + STOP + endif + +! ---------------------------------------------------------------- +! Find and Read TEMPERATURE Section +! ---------------------------------------------------------------- + + SECTION = '*SEED ' + CALL FIND(LUNCRP, SECTION, LNUM, FOUND) + IF (FOUND .EQ. 0) THEN + !CALL ERROR(SECTION, 42, FILECC, LNUM) + print*,"b" + stop + ELSE + + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + READ(C80,'(9X,F7.3)',IOSTAT=ERR) DSGT + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILECC,LNUM) + print*,"A3" + STOP + endif + + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + READ(C80,'(9X,F7.3)',IOSTAT=ERR) DGET + IF (ERR .NE. 0) THEN!CALL ERROR(ERRKEY,ERR,FILECC,LNUM) + print*,"A3" + STOP + endif + + CALL IGNORE(LUNCRP,LNUM,ISECT,C80) + READ(C80,'(9X,F7.3)',IOSTAT=ERR) SWCG + IF (ERR .NE. 0) THEN !CALL ERROR(ERRKEY,ERR,FILECC,LNUM) + print*,"A3" + STOP + endif + ENDIF + + CLOSE(LUNCRP) + +!----------------------------------------------------------------------- +! Open Ecotype File FILEE +!----------------------------------------------------------------------- + LNUM = 0 + PATHL = INDEX(PATHER,BLANK) + IF (PATHL .LE. 1) THEN + FILEGC = FILEE + ELSE + FILEGC = PATHER(1:(PATHL-1)) // FILEE + ENDIF + +!----------------------------------------------------------------------- +! Read Ecotype Parameter File +!----------------------------------------------------------------------- + !CALL GETLUN('FILEE', LUNECO) + LUNECO = 10 + OPEN (LUNECO,FILE = FILEGC,STATUS = 'OLD',IOSTAT=ERRNUM) + IF (ERRNUM .NE. 0) THEN !CALL ERROR(ERRKEY,ERRNUM,FILEE,0) + print*,"A3" + STOP + endif + + ECOTYP = ' ' + LNUM = 0 + DO WHILE (ECOTYP .NE. ECONO) + CALL IGNORE(LUNECO, LNUM, ISECT, C255) + IF (ISECT .EQ. 1 .AND. C255(1:1) .NE. ' ' .AND. + & C255(1:1) .NE. '*') THEN + READ(C255,3100,IOSTAT=ERRNUM) ECOTYP,ECONAM,TBASE,TOPT, + & ROPT,P2O,DJTI,GDDE,DSGFT,RUE, KCAN +3100 FORMAT (A6,1X,A16,1X,9(1X,F5.1)) + IF (ERRNUM .NE. 0) THEN !CALL ERROR(ERRKEY,ERRNUM,FILEE,LNUM) + print*,"A3" + STOP + endif + + IF (ECOTYP .EQ. ECONO) THEN +! Read optional cold sensitivity paramter. +! Default to TSEN = 6.0 if no value given. + IF (C255(80:84) == ' ') THEN + TSEN = 6.0 + ELSE + READ(C255(80:84),'(F5.0)',IOSTAT=ERRNUM) TSEN + IF (ERRNUM .NE. 0 .OR. TSEN < 1.E-6) TSEN = 6.0 + ENDIF + +! Read optional number of cold days paramter. +! Default to CDAY = 15.0 if no value given. + IF (C255(86:90) == ' ') THEN + CDAY = 15 + ELSE + READ(C255(86:90),'(I5)',IOSTAT=ERRNUM) CDAY + IF (ERRNUM .NE. 0 .OR. CDAY < 0) CDAY = 15 + ENDIF + + EXIT + ENDIF + + ELSEIF (ISECT .EQ. 0) THEN + !CALL ERROR(ERRKEY,7,FILEE,LNUM) + print*,"A3" + STOP + +! CHP 1/4/2004 +! IMPLEMENT THIS SECTION OF CODE WHEN A DEFAULT ECOTYPE HAS BEEN ADDED +! TO THE ECOTYPE FILE. +! IF (ECONO .EQ. 'DFAULT') CALL ERROR(ERRKEY,35,FILEGC,LNUM) +! +!! Write message to WARNING.OUT file that default ecotype +!! will be used. +! WRITE(MESSAGE(1),5000) ECONO, FILEE +! WRITE(MESSAGE(2),5001) +! 5000 FORMAT('Ecotype ',A6,' not found in file: ',A12) +! 5001 FORMAT('Default ecotype parameters will be used.') +! +! ECONO = 'DFAULT' +! REWIND(LUNECO) +! LNUM = 0 + ENDIF + ENDDO + + CLOSE (LUNECO) + ENDIF + + KEP = KCAN/(1-0.07)*(1-0.25) + + DO I=1,20 + STGDOY(I) = 9999999 + ENDDO + STGDOY(14) = YRSIM +! YREMRG = 9999999 + YREMRG = -99 !CHP 5/19/2011 + + CUMDTT = 0.0 + SUMDTT = 0.0 + DTT = 0.0 + GPP = 0.0 + ISTAGE = 7 + XSTAGE = 0.1 + MDATE = -99 + DUMMY = 0 + + ISDATE = 0 + TNSOIL = 0.0 + TMSOIL = 0.0 + TH = 00.0 + TEMPCX = 0. + TEMPCR = 0.0 + TDSOIL = 0.0 + SWSD = 0.0 + SNUP = 0.0 + SNDN = 0.0 + S1 = 0.0 + RATEIN = 0.0 + PSKER = 0.0 + PDTT = 0.0 + P9 = 0.0 + P3 = 0.0 + NDAS = 0.0 + L0 = 0.0 + L = 0 + DLV = 0.0 + DEC = 0.0 + C1 = 0.0 + ACOEF = 0.0 + DOPT = 0.0 + +! CHP 9/10/2004 P model + SeedFrac = 0.0 + VegFrac = 0.0 + +!---------------------------------------------------------------------- +! DYNAMIC = RATE OR INTEGRATE +! --------------------------------------------------------------------- + + ELSE + +! ------------------------------------------------------------- +! Compute Crown Temperature under snow pack. +! Used in COLD.for +! ------------------------------------------------------------- + ! TEMPCN = crown temperature when snow is present and + ! TMIN < 0. This function computes crown temperature + ! as higher than TMIN, C. + ! TEMPCX = crown temp. for max. development rate, C + ! SNOW = Snow depth, mm + ! XS = temporary snow depth variable, mm + + TEMPCN = TMIN + TEMPCX = TMAX + XS = SNOW + XS = AMIN1 (XS,15.0) + !------------------------------------------------------------ + ! Calculate crown temperature based on temperature and + ! snow cover. Crown temperature is higher than TAVG due + ! to energy balance of snow pack. + !------------------------------------------------------------ + IF (TMIN .LT. 0.0) THEN + TEMPCN = 2.0 + TMIN*(0.4+0.0018*(XS-15.0)**2) + ENDIF + IF (TMAX .LT. 0.0) THEN + TEMPCX = 2.0 + TMAX*(0.4+0.0018*(XS-15.0)**2) + ENDIF + TEMPCR = (TEMPCX + TEMPCN)/2.0 + + + !------------------------------------------------------------ + ! Compute thermal time based on new method developed by J.T.R + ! at CYMMIT, 5/5/98. TBASE, TOPT, and ROPT are read in + ! from the species file. + !------------------------------------------------------------ + + ! DOPT, Devlopment optimum temperature, is set to TOPT + ! during vegetative growth and to ROPT after anthesis + + DOPT = TOPT + IF ((ISTAGE .GT. 3) .AND. (ISTAGE .LE. 6)) THEN + DOPT = ROPT + ENDIF + + ! Check basic temperature ranges and calculate DTT for + ! development based on PC with JTR + + IF (TMAX .LT. TBASE) THEN + DTT = 0.0 + ELSEIF (TMIN .GT. DOPT) THEN + ! ! + !This statement replaces DTT = TOPT .. GoL and LAH, CIMMYT, 1999 + ! ! + DTT = DOPT - TBASE + ! ! + !Now, modify TEMPCN, TEMPCX based on soil conditions or snow + ! ! If wheat and barley is before terminal spiklett stage + ! ! Or if corn and sorghum are before 10 leaves + ! ! + ELSEIF (LEAFNO.LE.10) THEN + !Check for snow (should following be GT.0 or GT.15 ?). + ! !Based on snow cover, calculate DTT for the day + ! ! + IF (XS .GT. 0.0) THEN + ! ! + ! ! Snow on the ground + ! ! + DTT = (TEMPCN + TEMPCX)/2.0 - TBASE + ELSE + ! ! + ! ! No snow, compute soil temperature + ! ! + ACOEF = 0.01061 * SRAD + 0.5902 + TDSOIL = ACOEF * TMAX + (1.0 - ACOEF) * TMIN + TNSOIL = 0.36354 * TMAX + 0.63646 * TMIN + IF (TDSOIL .LT. TBASE) THEN + DTT = 0.0 + ELSE + IF (TNSOIL .LT. TBASE) THEN + TNSOIL = TBASE + ENDIF + IF (TDSOIL .GT. DOPT) THEN + TDSOIL = DOPT + ENDIF + !Import DAYL from WEATHR module. chp 5-6-02 + TMSOIL = TDSOIL * (DAYL/24.) + + & TNSOIL * ((24.-DAYL)/24.) + IF (TMSOIL .LT. TBASE) THEN + DTT = (TBASE+TDSOIL)/2.0 - TBASE + ELSE + DTT = (TNSOIL+TDSOIL)/2.0 - TBASE + ENDIF + ! ! + ! ! Statement added ... GoL and LAH, CIMMYT, 1999 + ! ! + DTT = AMIN1 (DTT,DOPT-TBASE) + ENDIF + ENDIF + ! + ! Now, compute DTT for when Tmax or Tmin out of range + ! + ELSEIF (TMIN .LT. TBASE .OR. TMAX .GT. DOPT) THEN + DTT = 0.0 + DO I = 1, 24 + TH = (TMAX+TMIN)/2. + (TMAX-TMIN)/2. * SIN(3.14/12.*I) + IF (TH .LT. TBASE) THEN + TH = TBASE + ENDIF + IF (TH .GT. DOPT) THEN + TH = DOPT + ENDIF + DTT = DTT + (TH-TBASE)/24.0 + END DO + ELSE + DTT = (TMAX+TMIN)/2.0 - TBASE + ENDIF + + !print*,"DTT",tmax,tmin,tbase + DTT = AMAX1 (DTT,0.0) + SUMDTT = SUMDTT + DTT + CUMDTT = CUMDTT + DTT + + +! ------------------------------------------------------------------ +! ISTAGE Definitions +! +! 7 - Sowing date +! 8 - Germination +! 9 - Emergence +! 1 - End juvenile +! 2 - Pannicle initiation +! 3 - End leaf growth +! 4 - End pannicle growth +! 5 - Grain fill +! 6 - Maturity +! ---------------------------------------------------------- + + + !--------------------------------------------------------- + ! ISTAGE = 7 - Determine sowing date + !--------------------------------------------------------- + IF (ISTAGE .EQ. 7) THEN + STGDOY(ISTAGE) = YRDOY + NDAS = 0.0 + ISTAGE = 8 + SUMDTT = 0.0 + IF (ISWWAT .EQ. 'N') RETURN + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + CUMDEP = 0.0 + DO L = 1, NLAYR + CUMDEP = CUMDEP + DLAYR(L) + IF (SDEPTH .LT. CUMDEP) GO TO 100 ! Was EXIT + END DO + 100 CONTINUE ! Sun Fix + L0 = L !L0 is layer that seed is in. + + RETURN + + + !----------------------------------------------------------------- + ! ISTAGE = 8 - Determine Germination Date + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 8) THEN + IF (ISWWAT .NE. 'N') THEN + IF (SW(L0) .LE. LL(L0)) THEN + SWSD = (SW(L0)-LL(L0))*0.65 + + & (SW(L0+1)-LL(L0+1))*0.35 + NDAS = NDAS + 1 + + IF (NDAS .GE. DSGT) THEN + ISTAGE = 6 + PLTPOP = 0.00 + GPP = 1.0 + + WRITE(MESSAGE(1),3500) + !CALL WARNING(1,'MZPHEN',MESSAGE) + WRITE ( *,3500) + IF (IDETO .EQ. 'Y') THEN + WRITE (NOUTDO,3500) + ENDIF + MDATE = YRDOY + RETURN + ENDIF + !Germinate when soil water > 0.02 cm3/cm3 + + IF (SWSD .LT. SWCG) RETURN + ENDIF + ENDIF + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + ISTAGE = 9 + CUMDTT = 0.0 + SUMDTT = 0.0 + + P9 = 45.0 + GDDE*SDEPTH + RETURN + + + !----------------------------------------------------------------- + ! ISTAGE = 9 - Determine Seedling Emergence Date + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 9) THEN + NDAS = NDAS + 1 + ! Emerge when P9 GDD's have been accumulated +! IF (SUMDTT .LT. P9) RETURN + IF (YREMRG .LE. 0) THEN + IF (SUMDTT .LT. P9) RETURN + ELSE + IF (YRDOY .LT. YREMRG) RETURN + ENDIF + ! If GDD's pass a threshold, terminate model run + + IF (P9 .GT. DGET) THEN + ISTAGE = 6 + PLTPOP = 0.00 + GPP = 1.0 + + WRITE(MESSAGE(1),1399) + !CALL WARNING(1,'MZPHEN',MESSAGE) + + WRITE ( *,1399) + IF (IDETO .EQ. 'Y') THEN + WRITE (NOUTDO,1399) + ENDIF + MDATE = YRDOY + RETURN + ENDIF + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + ISTAGE = 1 + SUMDTT = SUMDTT - P9 + TLNO = 30.0 + YREMRG = STGDOY(9) !Passed back into water balance routi + RETURN + + !----------------------------------------------------------------- + ! ISTAGE = 1 - Emergence to End of Juvenile Stage + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 1) THEN + NDAS = NDAS + 1 !NDAS - number of days after sowing + XSTAGE = SUMDTT/P1 !XSTAGE - noninteger growth stage (0-1 + ! Used to compute N demand + ! Stage occurs when GDD threshold reached + !Return if end of juvenile stage is not reached + +! chp 9/23/2004 +! For P model, we need to estimate the fraction of time completed +! between emergence and tassel initiation, VegFrac. Because stage 2 +! (end of juvenile stage to tassel initiation) completion is not +! based on physiological time, but rather on daylight hours, we +! will make the assumption that the physical duration of that phase +! is 5 days at optimum temperature. + +! CHP 5/11/2005 +! Extend VegFrac to include phases 3 & 4 (to beginning of effective +! grain filling). Reduce Seed Frac to phase 5. +! VegFrac = SUMDTT / (P1 + 5.0 * (DOPT - TBASE)) +! don't know value of P3 yet +! VegFrac = SUMDTT / (P1 + 5. * (DOPT - TBASE) + P3 + DSGFT) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! VegFrac = SUMDTT / (P1 + 20. * (DOPT - TBASE) + DSGFT) +! VegFrac = SUMDTT / (P1 + 20. * (DOPT - TBASE)) +! 5/30/2007 CHP Estimate of total time is way off for EAAMOD runs, +! try using 25* instead of 20* + VegFrac = SUMDTT / (P1 + 25. * (DOPT - TBASE)) + + IF (SUMDTT .LT. P1) RETURN + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + ISTAGE = 2 + SIND = 0.0 + + + !----------------------------------------------------------------- + ! ISTAGE = 2 - End of Juvenile Stage to Tassel Initiation + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 2) THEN + !NDAS - number of days after sowing + NDAS = NDAS + 1 + !XSTAGE - noninteger growth stage (1-1.5) + XSTAGE = 1.0 + 0.5*SIND ! Used to compute N demand. + + PDTT = DTT + IF (ISWWAT .EQ. 'N') THEN + DUMMY = DUMMY + 1 + ENDIF + + IF (DUMMY .EQ. 1) THEN + PDTT = SUMDTT - P1 + ENDIF + +! chp 9/23/2004 +! See note for VegFrac under ISTAGE = 1, above +! VegFrac = SUMDTT / (P1 + 5.0 * (DOPT - TBASE)) +! don't know value of P3 yet +! VegFrac = SUMDTT / (P1 + 5. * (DOPT - TBASE) + P3 + DSGFT) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! VegFrac = SUMDTT / (P1 + 20. * (DOPT - TBASE) + DSGFT) +! VegFrac = SUMDTT / (P1 + 20. * (DOPT - TBASE)) +! 5/30/2007 CHP Estimate of total time is way off for EAAMOD runs, +! try using 25* instead of 20* + VegFrac = MAX(VegFrac,SUMDTT / (P1 + 25. *(DOPT - TBASE))) + + !RATEIN - floral rate of development driven by daylength + ! and photoperiod sensitivity value for maize (different + ! for SG, ML + !TWILEN = AMAX1 (TWILEN,P2O) + + IF (TWILEN .GT. P2O) THEN + RATEIN = 1.0/(DJTI+P2*(TWILEN-P2O)) + ELSE + RATEIN = 1.0 / DJTI + ENDIF + PDTT = 1.0 + SIND = SIND + RATEIN*PDTT + !Return if panicle initiation has not been reached + IF (SIND .LT. 1.0) RETURN + + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + ISTAGE = 3 + XNTI = SUMDTT/43.0 + !Next 2 lines: Change implemented at CIMMYT 1999 - JTR,US + TLNO = SUMDTT/(PHINT*0.5)+ 5.0 + P3 = ((TLNO + 0.5) * PHINT) - SUMDTT + XNTI = XN + +! chp 5/11/2005 + SUMDTT_2 = SUMDTT !SUMDTT_2 = P1 + P2 + VegFrac = MAX(VegFrac,SUMDTT_2 / (SUMDTT_2 + P3 + DSGFT)) + + SUMDTT = 0.0 + +! chp 9/23/2004, removed 5/11/2005 +! VegFrac = 1.0 + + !----------------------------------------------------------------- + ! ISTAGE = 3 - Tassel Initiation to End of Leaf Growth + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 3) THEN + ! NDAS - number of days after sowing + NDAS = NDAS + 1 + ! XSTAGE - noninteger growth stage (1.5-4.5) + ! Used to compute N demand. + XSTAGE = 1.5 + 3.0*SUMDTT/P3 + +! chp 9/23/2004 +! For P model, we need to estimate the fraction of time +! completed between tassel initiation and physiological +! maturity, SeedFrac. +! CHP 5/11/2005 Extend VegFrac thru stage 4 +! SeedFrac = SUMDTT / (P3 + DSGFT + P5) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! VegFrac = (SUMDTT + SUMDTT_2) / (SUMDTT_2 + P3 + DSGFT) + VegFrac = MAX(VegFrac,(SUMDTT + SUMDTT_2) / (SUMDTT_2+P3)) + + IF (SUMDTT .LT. P3) RETURN + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + ISDATE = YRDOY + ISTAGE = 4 + SUMDTT = SUMDTT - P3 + IDURP = 0 + +! CHP 5/25/2007 Move inflection point back to end of stage 3 + VegFrac = 1.0 + + !----------------------------------------------------------------- + ! ISTAGE = 4 - End of Leaf Growth to Beginning Effective Gra + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 4) THEN + NDAS = NDAS + 1 + IDURP = IDURP + 1 + ! Determine beginning of effective grain filling period fo + ! maize. Silking to beginning EFG is assumed to be 170 G + XSTAGE = 4.5+5.5*SUMDTT/(P5*0.95) + +! chp 9/23/2004, 5/11/2005 +! SeedFrac = (SUMDTT + P3) / (P3 + DSGFT + P5) +! VegFrac = (SUMDTT + SUMDTT_2 + P3) / (SUMDTT_2 + P3+DSGFT) +! VegFrac = AMIN1(VegFrac, 1.0) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 + SeedFrac = SUMDTT / P5 + + IF (SUMDTT .LT. DSGFT) RETURN + + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + + ! When Silking phase ends and beginning of effective grain + ! filling begins. Compute grains per plant, ears per pla + ! and barrenness + + PSKER = SUMP*1000.0/IDURP*3.4/5.0 + GPP = G2*PSKER/7200.0 + 50.0 + GPP = AMIN1 (GPP, G2) + GPP = AMAX1 (GPP,0.0) + EARS = PLTPOP + + !Determine barrenness for maize + GPP = AMAX1 (GPP,51.0) + ! + ! Barreness (mod. US and PWW, 7-21-98) + ! Barreness function based on stress (PSKER f(SUMP)) + ! Smoothing function for ear number reduction + ! + IF (GPP .LT. G2*0.15) THEN + EARS = PLTPOP*(GPP/(G2*0.15))**0.33 + ELSE + ! + ! CIMMYT - US & JTR revised barreness function + ! + IF (PLTPOP .GT. 12.0) THEN + ! + ! Barreness from high population + ! + IF (GPP .LT. G2*0.5) THEN + ! ABSTRES = AMAX1 (SI1(3), SI3(3)) + ! + ! Barreness effect with min. N and H2O stress + ! + ! IF (ABSTRES .LT. 0.25) THEN + BARFAC = 0.0085*(1.0-GPP/G2)*PLTPOP**1.5 + EARS = PLTPOP*(GPP/(G2*0.50))**BARFAC + ! ENDIF + ENDIF + ENDIF + ENDIF + + EARS = AMAX1 (EARS,0.0) + STGDOY(ISTAGE) = YRDOY + ISTAGE = 5 + +! CHP 5/11/2005 +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! VegFrac = 1.0 + + !----------------------------------------------------------------- + ! ISTAGE = 5 - Beginning to end of effective grain filling p + !----------------------------------------------------------------- + + ELSEIF (ISTAGE .EQ. 5) THEN + NDAS = NDAS + 1 + XSTAGE = 4.5 + 5.5*SUMDTT/P5 + +! chp 9/23/2004, 5/11/2005 +! SeedFrac = (SUMDTT + P3) / (P3 + DSGFT + P5) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! SeedFrac = (SUMDTT - DSGFT) / (P5 - DSGFT) + SeedFrac = SUMDTT / P5 + + IF (SUMDTT .LT. P5*0.95) RETURN !End of EFP assumed to be 95% + !------------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Variables + !------------------------------------------------------------- + STGDOY (ISTAGE) = YRDOY + ISTAGE = 6 + + !----------------------------------------------------------------- + ! ISTAGE = 6 - End Effective Grain Filling to Physiological + !----------------------------------------------------------------- + ELSEIF (ISTAGE .EQ. 6) THEN + IF (DTT .LT. 2.0) SUMDTT = P5 + +! chp 9/23/2004, 5/11/2005 +! SeedFrac = (SUMDTT + P3) / (P3 + DSGFT + P5) + SeedFrac = (SUMDTT - DSGFT) / (P5 - DSGFT) + +! CHP 5/25/2007 Move inflection point back to end of stage 3 +! SeedFrac = (SUMDTT - DSGFT) / (P5 - DSGFT) + SeedFrac = SUMDTT / P5 + + IF (SUMDTT .LT. P5) RETURN + !--------------------------------------------------------- + ! New Growth Stage Occurred Today. Initialize Some Varia + !--------------------------------------------------------- + STGDOY(ISTAGE) = YRDOY + MDATE = YRDOY + !ISTAGE = 7 + ISTAGE = 10 !CHP - Prevents growth parameters from being + ! set back to initial values. 08/11/03 + CUMDTT = 0.0 + DTT = 0.0 + IF (PLTPOP .NE. 0.0) THEN + IF (GPP .LE. 0.0) THEN + GPP = 1.0 + ENDIF + ENDIF + +! chp 5/11/2005 + SeedFrac = 1.0 +! ---------------------------------------------------------------------- + ENDIF ! End ISTAGE Loop +! ---------------------------------------------------------------------- + + ENDIF ! End DYNAMIC STRUCTURE + RETURN + +!----------------------------------------------------------------------- +! Format Strings +!----------------------------------------------------------------------- + +1399 FORMAT (10X,'Seed ran out of metabolite due to deep planting') +3500 FORMAT ('Crop failure because of lack of germination ', + & 'within 15 days of sowing') + + END SUBROUTINE MZ_PHENOL + +! DYNAMIC Modular control +! ABSTRES Maximum of water stress stage 1 and 3 +! ACOEF Coefficient +! BARFAC Factor to reduce ears/plant under high populations (barrenn +! C1 Used to comptue daylength (computed in maize.for) +! CUMDEP Cumulative depth of soil, cm +! CUMDTT Cumulative daily thermal time after germination, C +! DAYL Daylength, hours +! DEC Used to compute daylength +! DGET Threshold defined as growing degree days between germination and emergence. +! If this threshold is exceeded, crop failure ocurrs. +! DJTI Minimum days from end of juvenile stage to tassel initiation if the cultivar +! is not photoperiod sensitive, DJTI +! DLAYR(L) Soil thickness in layer L (cm) +! DLV Used to compute daylength +! DOPT Development optimum temperature +! DSGFT GDD from silking to effective grain filling period, C +! DSGT Maximum number of days from sowing to germination before crop failure occurs. +! DTT Growing degree days today, C +! DUMMY Temporary variable +! EARS Ears per m2, computed here and used in grosub. +! ECONO Ecotype number for the variety (not really used in maize ye +! ERR Determines if error in reading file (0=ok, 1=error) +! ERRKEY Variable containing routine where error occurred +! (ERRKEY='MZ_PHENL') +! FILEC Filename of .SPE or species file +! FILEIO Filename containing model inputs (IBSNAT35.INP) +! FOUND Indicates if a section in a file is found +! G2 Potential kernel number, kernels/plant +! G3 Potential kernel growth rate mg/kernel/day +! GDDE Growing degree days per cm seed depth required for emergence, GDD/cm +! GPP Grain number per plant, grains/plant +! I Loop counter +! IDETO Screen output switch (Y/N) +! IDURP Duration of ISTAGE 4, calendar days +! ISTAGE Growth stage +! ISWWAT Water balance switch (Y/N) +! LEAFNO Number of oldest leaf per plant (same as XN) +! L Loop counter +! L0 Temporary soil layer number +! LINC Indicates if a line is a good line +! LL(NL) Soil water lower limit, cm3/cm3 +! LNUM Line number in an input file +! LUNIO Logical input number for model input file +! LUNIO Assign value to LUNIO for local use. +! MDATE Year and day of year of maturity +! NDAS Number of days after sowing +! NLAYR Number of soil layers +! NOUTDO Output file number +! P1 GDD from seedling emergence to end of juvenile phase, C +! P2 Photoperiod sensitivity coefficient, 1/hr +! P2O Minimum daylength below which daylength does not affect dev +! P3 Cumulative GDD required to complete ISTAGE 3, C +! P5 GDD from silking to physiological maturity, C +! P9 Growing degree days from germination to emergence, C +! PATHCR Pathname of species file +! DTT +! PHINT Phyllochron interval. Number of GDD required for new leaf e +! PLTPOP Plant population, no./m2 +! PSKER Average rate of photosynthesis during ISTAGE 4 +! RATEIN Rate of floral induction +! ROPT Second optimum temperature for development from species fil +! SDEPTH Sowing depth, cm +! SECTION Temporary variable used to identify section in a file +! S1 Used to compute daylength (computed in maize.for) +! SI1(6) Water stress during a growth stage used for output +! SI3(6) Water stress during a growth stage used for output +! SIND Summed photoperiod induction rate +! SNDN Sun down +! SNOW Snow, mm +! SNUP Sun up +! SRAD Daily solar radiation, MJ/m2/day +! STGDOY(20) Year and day of year that a growth stage occurred on +! SUMDTT Sum of GDD for a given stage, C +! SUMP Cumulative plant growth during ISTAGE 4, g/plant +! SW(NL) Soil water content in layer, cm3/cm3 +! SWCG Minimum soil water available required for germination to occur, cm3/cm3 +! SWSD Modified soil water content for computing emergence +! TBASE Base temperature for development from ecotype file, C +! TDSOIL Weighted average soil temperature, C +! TEMPCN Crown temperature when snow is present and TMIN < 0. This f +! computes crown temperature as higher than TMIN, C. +! TEMPCR Crown temperature, C +! TEMPCX Crown temperature for maximum development rate, C +! TH Intermedate variable for computing GDD today, C +! TLNO Total leaf numbers that will eventually develop +! TMAX Daily maximum temperature, C +! TMIN Daily minimum temperature, C +! TMSOIL Weighted average soil temperature, C +! TNSOIL Weighted average soil temperture, C +! TOPT Optimum temperature for development from species file, C +! TWILEN Twilight definition of daylength +! VARNO Variety identification number +! VRNAME Variety name +! WTHADJ(2,8)Note, used here, but not passed into maize.for from cropgro +! WMODB*1 Note, used here, but not passed into maize.for from cropgro +! XLAT Latitude +! XN Number of oldest expanding leaf +! XNTI Number of leaves at tassel initiation (used in grosub) +! XS Temporary snow depth variable +! XSTAGE Non-integer growth stage indicator +! YRDOY Year and day of year +! YREMRG Year and day of year of emergence (passed back to water bal +! YRSIM Year and day of year of first day of simulation + diff --git a/lib/maize/mz.o b/lib/maize/mz.o new file mode 100644 index 0000000000000000000000000000000000000000..b7bc856639eb3fa070c3515135f98f7f7732ac1a GIT binary patch literal 36752 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 literal 0 HcmV?d00001 diff --git a/models/maturity.go b/models/maturity.go new file mode 100644 index 0000000..bbf4c98 --- /dev/null +++ b/models/maturity.go @@ -0,0 +1,114 @@ +package models + +import ( + "strconv" + "time" + + validation "github.com/go-ozzo/ozzo-validation" + + "gitlab.cs.umd.edu/dawn/dawn-go-common/common" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence/entities" +) + +type CultivarRequest struct { + Name string `json:"name"` +} + +type Cultivar struct { + VarName string `json:"var_name"` + VarNum string `json:"var_num"` + EcoNum string `json:"eco_num"` + P1 float64 `json:"p1"` + P2 float64 `json:"p2"` + P5 float64 `json:"p5"` + G2 float64 `json:"g2"` + G3 float64 `json:"g3"` + PHINT float64 `json:"phint"` +} + +type CultivarResponse struct { + Cultivars []Cultivar `json:"cultivars"` +} + +func CreateCultivar(c entities.Cultivar) Cultivar { + return Cultivar{ + VarName: c.VarName, + VarNum: c.VarNum, + EcoNum: c.EcoNum, + P1: c.P1, + P2: c.P2, + P5: c.P5, + G2: c.P2, + G3: c.G3, + PHINT: c.PHINT, + } +} + +type CornMaturityRequest struct { + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + PlantDate time.Time `json:"plant_date"` + VarName string `json:"var_name"` + VarNum string `json:"var_num"` + EcoNum string `json:"eco_num"` + P1 float64 `json:"p1"` + P2 float64 `json:"p2"` + P5 float64 `json:"p5"` + G2 float64 `json:"g2"` + G3 float64 `json:"g3"` + PHINT float64 `json:"phint"` +} + +type CornMaturityResponse struct { + HarvestDate time.Time `json:"harvest_date"` +} + +func (r CornMaturityRequest) Validate() error { + + return validation.ValidateStruct(&r, + validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)), + validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)), + ) +} + +func BuildCornMaturityRequest(ctx common.DawnCtx) CornMaturityRequest { + + latitude, _ := strconv.ParseFloat(ctx.FiberCtx.Query("latitude", "-100000.0"), 64) + longitude, _ := strconv.ParseFloat(ctx.FiberCtx.Query("longitude", "-100000.0"), 64) + + varName := ctx.FiberCtx.Query("var_name", "") + varNum := ctx.FiberCtx.Query("var_num", "") + ecoNum := ctx.FiberCtx.Query("eco_num", "") + plant_month, _ := strconv.Atoi(ctx.FiberCtx.Query("plant_month", "0")) + plant_day, _ := strconv.Atoi(ctx.FiberCtx.Query("plant_day", "0")) + + plant_date := time.Date(time.Now().Year(), time.Month(plant_month), plant_day, 0, 0, 0, 0, time.UTC) + + p1, _ := strconv.ParseFloat(ctx.FiberCtx.Query("p1", "0"), 64) + p2, _ := strconv.ParseFloat(ctx.FiberCtx.Query("p2", "0"), 64) + p5, _ := strconv.ParseFloat(ctx.FiberCtx.Query("p5", "0"), 64) + g2, _ := strconv.ParseFloat(ctx.FiberCtx.Query("g2", "0"), 64) + g3, _ := strconv.ParseFloat(ctx.FiberCtx.Query("g3", "0"), 64) + phint, _ := strconv.ParseFloat(ctx.FiberCtx.Query("phint", "0"), 64) + rNew := CornMaturityRequest{ + Latitude: latitude, + Longitude: longitude, + VarName: varName, + VarNum: varNum, + EcoNum: ecoNum, + P1: p1, + P2: p2, + P5: p5, + G2: g2, + G3: g3, + PHINT: phint, + PlantDate: plant_date, + } + + if rNew.Validate() != nil { + panic(config.BAD_REQUEST) + } + return rNew + +} diff --git a/models/seeds.go b/models/seeds.go index c837463..1b6817b 100644 --- a/models/seeds.go +++ b/models/seeds.go @@ -1,68 +1,27 @@ package models -import ( - "strconv" - "time" - - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config" - - validation "github.com/go-ozzo/ozzo-validation" - "github.com/gofiber/fiber/v2" -) - -type SeedListRequest struct { - Product string `json:"product"` -} - -type SeedListResponse struct { - Seeds []string `json:"seeds"` -} - -type CornMaturityRequest struct { - Latitude float64 `json:"latitude"` - Longitude float64 `json:"longitude"` - Gdds float64 `json:"gdds"` - Month int `json:"month"` - Date int `json:"date"` -} - -type CornMaturityResponse struct { - Date time.Time `json:"date"` - GDD float64 `json:"gdd"` - ClosestGDD float64 `json:"closest_gdd"` - ClosestLatitude float64 `json:"closest_latitude"` - ClosestLongitude float64 `json:"closest_longitude"` -} - -func (r CornMaturityRequest) Validate() error { - return validation.ValidateStruct(&r, - validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)), - validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)), - validation.Field(&r.Gdds, validation.Required, validation.Min(0.0), validation.Max(6000.0)), - validation.Field(&r.Month, validation.Required, validation.Min(1), validation.Max(12)), - validation.Field(&r.Date, validation.Required, validation.Min(1), validation.Max(31)), - ) -} - -func BuildCornMaturityRequest(c *fiber.Ctx) CornMaturityRequest { - - lat, _ := strconv.ParseFloat(c.Query("latitude", "-10000.0"), 64) - lon, _ := strconv.ParseFloat(c.Query("longitude", "-10000.0"), 64) - month, _ := strconv.Atoi(c.Query("month", "0")) - date, _ := strconv.Atoi(c.Query("date", "0")) - gdds, _ := strconv.ParseFloat(c.Query("gdds", "-10000.0"), 64) - - newRequest := CornMaturityRequest{ - Latitude: lat, - Longitude: lon, - Gdds: gdds, - Month: month, - Date: date, - } - - if e := newRequest.Validate(); e != nil { - panic(config.BAD_REQUEST.AddLogDetails(e.Error())) - } - - return newRequest -} +// type SeedListRequest struct { +// Product string `json:"product"` +// } + +// type SeedListResponse struct { +// Seeds []string `json:"seeds"` +// } + +// type CornMaturityRequest struct { +// Latitude float64 `json:"latitude"` +// Longitude float64 `json:"longitude"` +// Gdds float64 `json:"gdds"` +// Month int `json:"month"` +// Date int `json:"date"` +// } + +// func (r CornMaturityRequest) Validate() error { +// return validation.ValidateStruct(&r, +// validation.Field(&r.Latitude, validation.Required, validation.Min(-90.0), validation.Max(90.0)), +// validation.Field(&r.Longitude, validation.Required, validation.Min(-180.0), validation.Max(180.0)), +// validation.Field(&r.Gdds, validation.Required, validation.Min(0.0), validation.Max(6000.0)), +// validation.Field(&r.Month, validation.Required, validation.Min(1), validation.Max(12)), +// validation.Field(&r.Date, validation.Required, validation.Min(1), validation.Max(31)), +// ) +// } diff --git a/persistence/entities/gdd.go b/persistence/entities/gdd.go index f17aff3..62ba7c9 100644 --- a/persistence/entities/gdd.go +++ b/persistence/entities/gdd.go @@ -18,6 +18,8 @@ type Gdd struct { Year int `bson:"year,omitempty"` MinTemps []float64 `bson:"min_temps,omitempty"` MaxTemps []float64 `bson:"max_temps,omitempty"` + SRAD []float64 `bson:"srad,omitempty"` + Precip []float64 `bson:"precip,omitempty"` Location Location `bson:"location,omitempty"` } @@ -38,5 +40,6 @@ type CfsGdd struct { MaxTemps []float64 `bson:"max_temps,omitempty"` VarMin []float64 `bson:"var_mins,omitempty"` VarMax []float64 `bson:"var_maxs,omitempty"` + Srad []float64 `bson:"srad,omitempty"` Date primitive.DateTime `bson:"date,omitempty"` } diff --git a/persistence/entities/maturity.go b/persistence/entities/maturity.go new file mode 100644 index 0000000..c0eb825 --- /dev/null +++ b/persistence/entities/maturity.go @@ -0,0 +1,13 @@ +package entities + +type Cultivar struct { + VarName string `bson:"var_name"` + VarNum string `bson:"var_num"` + EcoNum string `bson:"eco_num"` + P1 float64 `bson:"p1"` + P2 float64 `bson:"p2"` + P5 float64 `bson:"p5"` + G2 float64 `bson:"g2"` + G3 float64 `bson:"g3"` + PHINT float64 `bson:"phint"` +} diff --git a/persistence/mongodb.go b/persistence/mongodb.go index 0966ac4..da70349 100644 --- a/persistence/mongodb.go +++ b/persistence/mongodb.go @@ -11,6 +11,7 @@ import ( "github.com/bradfitz/slice" "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -21,7 +22,7 @@ func buildLocationRequest(location entities.Location, year *int) bson.M { "location": bson.M{ "$nearSphere": bson.M{ "$geometry": location, - "$maxDistance": 5000, + "$maxDistance": 150000, }, }, "year": *year, @@ -31,7 +32,7 @@ func buildLocationRequest(location entities.Location, year *int) bson.M { "location": bson.M{ "$nearSphere": bson.M{ "$geometry": location, - "$maxDistance": 5000, + "$maxDistance": 150000, }, }, } @@ -148,6 +149,7 @@ func CfsFindAllByLocation(location entities.Location) entities.CfsGdd { var g entities.CfsGdd err := coll.FindOne(common.Ctx, filter).Decode(&g) + if err != nil { panic(config.NO_DATA_FOUND) } @@ -235,3 +237,48 @@ func FindSeeds(product string) []entities.Seed { return results } + +func FindCultivarByName(name string) entities.Cultivar { + coll := common.DB.Collection("dssat") + + filter := bson.M{ + "var_name": bson.M{ + "$regex": primitive.Regex{Pattern: name, Options: "i"}, + }, + } + + var results entities.Cultivar + + err := coll.FindOne(common.Ctx, filter).Decode(&results) + if err != nil { + panic(config.NO_DATA_FOUND) + } + + return results +} + +func FindCultivarsByName() []entities.Cultivar { + coll := common.DB.Collection("dssat") + + var results []entities.Cultivar + + options := options.Find() + + cursor, err := coll.Find(common.Ctx, bson.D{}, options) + if err != nil { + panic(config.NO_DATA_FOUND) + } + + for cursor.Next(context.TODO()) { + + var elem entities.Cultivar + err := cursor.Decode(&elem) + if err != nil { + panic(config.NO_DATA_FOUND) + } + + results = append(results, elem) + } + + return results +} diff --git a/services/maturity_service.go b/services/maturity_service.go new file mode 100644 index 0000000..686b741 --- /dev/null +++ b/services/maturity_service.go @@ -0,0 +1,147 @@ +package services + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "strconv" + "strings" + "time" + + "gitlab.cs.umd.edu/dawn/dawn-go-common/common" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence" + "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence/entities" +) + +type CornMaturityConfig struct { + PlantDate int `json:"plant_date"` + Tmins []float64 `json:"tmins"` + Tmaxs []float64 `json:"tmaxs"` + Srads []float64 `json:"srads"` + Units string `json:"units"` +} + +func GetCultivars(ctx common.DawnCtx, request models.CultivarRequest) models.CultivarResponse { + if request.Name != "" { + elem := persistence.FindCultivarByName(request.Name) + cultivar := models.CreateCultivar(elem) + return models.CultivarResponse{ + Cultivars: []models.Cultivar{cultivar}, + } + } else { + elems := persistence.FindCultivarsByName() + var cultivars []models.Cultivar + for _, e := range elems { + cultivars = append(cultivars, models.CreateCultivar(e)) + } + return models.CultivarResponse{ + Cultivars: cultivars, + } + } +} + +func getFullYearData(ctx common.DawnCtx, latitude float64, longitude float64, plantDate time.Time) CornMaturityConfig { + location := entities.Location{ + Type: "Point", + Coordinates: []float64{longitude, latitude}, + } + + observed := persistence.CurrentGddFindFirstByYearAndLocation(ctx, location) + predicted := persistence.CfsFindAllByLocation(location) + + tmins := append(observed.MaxTemps, predicted.MaxTemps...) + tmaxs := append(observed.MinTemps, predicted.MinTemps...) + srads := append(observed.SRAD, predicted.Srad...) + + pd := plantDate.YearDay() + + if plantDate.Year()%4 == 0 && plantDate.Year()%100 != 0 || plantDate.Year()%400 == 0 { + pd -= 1 + } + + return CornMaturityConfig{ + PlantDate: pd, + Tmins: tmins, + Tmaxs: tmaxs, + Srads: srads, + Units: "F", + } +} + +func CalculateMaturity(ctx common.DawnCtx, request models.CornMaturityRequest) models.CornMaturityResponse { + + cfg := getFullYearData(ctx, request.Latitude, request.Longitude, request.PlantDate) + fileId := rand.Intn(99-10) + 10 + + file, _ := json.MarshalIndent(cfg, "", " ") + + _ = ioutil.WriteFile("lib/maize/"+strconv.Itoa(fileId)+".json", file, 0644) + + original, err := os.Open("lib/maize/DSSAT.INP") + if err != nil { + panic(err) + } + new, err := os.Create("lib/maize/DSSAT" + strconv.Itoa(fileId) + ".INP") + if err != nil { + panic(err) + } + _, err = io.Copy(new, original) + if err != nil { + panic(err) + } + new.Close() + original.Close() + + f, err := os.OpenFile("lib/maize/DSSAT"+strconv.Itoa(fileId)+".INP", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + panic(err) + } + + cultivarLine := fmt.Sprintf("%s %s %s %s %s %s %s %s %s", + request.VarNum, + request.VarName, + request.EcoNum, + fmt.Sprintf("%f", request.P1)[:5], + fmt.Sprintf("%f", request.P2)[:5], + fmt.Sprintf("%f", request.P5)[:5], + fmt.Sprintf("%f", request.G2)[:5], + fmt.Sprintf("%f", request.G3)[:5], + fmt.Sprintf("%f", request.PHINT)[:5], + ) + + if _, err = f.WriteString(cultivarLine); err != nil { + panic(err) + } + f.Close() + + cmd := exec.Command("bash", "-c", "python3 execute.py --input "+strconv.Itoa(fileId)+".json --config "+strconv.Itoa(fileId)+" --predicted") + cmd.Dir = "./lib/maize" + out, _ := cmd.Output() + + value := strings.TrimSpace(string(out)) + if value == "-1" || strings.HasPrefix(value, "A") { + panic(config.BAD_REQUEST) + } + + year, _ := strconv.Atoi(value[:4]) + doy, _ := strconv.Atoi(value[4:]) + + date := time.Date(year, time.January, 1, 0, 0, 0, 0, time.UTC) + if year%4 == 0 && year%100 != 0 || year%400 == 0 { + doy -= 1 + } + date = date.AddDate(0, 0, doy) + + os.Remove("lib/maize/" + strconv.Itoa(fileId) + ".json") + os.Remove("lib/maize/DSSAT" + strconv.Itoa(fileId) + ".INP") + + return models.CornMaturityResponse{ + HarvestDate: date, + } +} diff --git a/services/seed_service.go b/services/seed_service.go index d1a9eed..c26b259 100644 --- a/services/seed_service.go +++ b/services/seed_service.go @@ -1,69 +1,69 @@ package services -import ( - "math" - "time" +// import ( +// "math" +// "time" - "gitlab.cs.umd.edu/dawn/dawn-go-common/common" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models/enums" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence" - "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/utils" +// "gitlab.cs.umd.edu/dawn/dawn-go-common/common" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/config" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models/enums" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence" +// "gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/utils" - "github.com/gofiber/fiber/v2" -) +// "github.com/gofiber/fiber/v2" +// ) -func GetSeedList(c *fiber.Ctx, request models.SeedListRequest) models.SeedListResponse { - product := enums.GetProductFromString(request.Product) - if product.Name != enums.ProductType.CORN.Name && product.Name != enums.ProductType.SOYBEAN.Name { - panic(config.INVALID_PRODUCT(request.Product)) - } - seeds := persistence.FindSeeds(product.Name) - var results []string - for i := 0; i < len(seeds); i++ { - results = append(results, seeds[i].Seed) - } - return models.SeedListResponse{Seeds: results} -} +// func GetSeedList(c *fiber.Ctx, request models.SeedListRequest) models.SeedListResponse { +// product := enums.GetProductFromString(request.Product) +// if product.Name != enums.ProductType.CORN.Name && product.Name != enums.ProductType.SOYBEAN.Name { +// panic(config.INVALID_PRODUCT(request.Product)) +// } +// seeds := persistence.FindSeeds(product.Name) +// var results []string +// for i := 0; i < len(seeds); i++ { +// results = append(results, seeds[i].Seed) +// } +// return models.SeedListResponse{Seeds: results} +// } -func GetCornMaturityDate(ctx common.DawnCtx, request models.CornMaturityRequest) models.CornMaturityResponse { +// func GetCornMaturityDate(ctx common.DawnCtx, request models.CornMaturityRequest) models.CornMaturityResponse { - gddRequest := models.GddRequest{ - Year: time.Now().Year(), - Product: "corn", - Latitude: request.Latitude, - Longitude: request.Longitude, - Accumulate: false, - } +// gddRequest := models.GddRequest{ +// Year: time.Now().Year(), +// Product: "corn", +// Latitude: request.Latitude, +// Longitude: request.Longitude, +// Accumulate: false, +// } - gdds := GetFullYearGddValues(ctx, gddRequest) - closestValue := 0.0 - closestIdx := 0 - gdus := 0.0 +// gdds := GetFullYearGddValues(ctx, gddRequest) +// closestValue := 0.0 +// closestIdx := 0 +// gdus := 0.0 - startingDate := time.Date(time.Now().Year(), time.Month(request.Month), request.Date, 0, 0, 0, 0, time.UTC) - startingIdx := startingDate.Sub(time.Date(time.Now().Year(), time.January, 1, 0, 0, 0, 0, time.UTC)) - startingIdxVal := int(startingIdx.Hours() / 24) - if isLeapYear(time.Now().Year()) { - startingIdxVal -= 1 - } +// startingDate := time.Date(time.Now().Year(), time.Month(request.Month), request.Date, 0, 0, 0, 0, time.UTC) +// startingIdx := startingDate.Sub(time.Date(time.Now().Year(), time.January, 1, 0, 0, 0, 0, time.UTC)) +// startingIdxVal := int(startingIdx.Hours() / 24) +// if isLeapYear(time.Now().Year()) { +// startingIdxVal -= 1 +// } - for i := startingIdxVal; i < len(gdds.GddValues); i++ { - value := gdds.GddValues[i] - gdus += value - if math.Abs(gdus-request.Gdds) < math.Abs(closestValue-request.Gdds) { - closestValue = gdus - closestIdx = i - } - } - response := models.CornMaturityResponse{ - Date: utils.ConvertDateIdxToDate(closestIdx), - GDD: request.Gdds, - ClosestGDD: closestValue, - ClosestLatitude: gdds.ClosestLatitude, - ClosestLongitude: gdds.ClosestLongitude, - } - return response +// for i := startingIdxVal; i < len(gdds.GddValues); i++ { +// value := gdds.GddValues[i] +// gdus += value +// if math.Abs(gdus-request.Gdds) < math.Abs(closestValue-request.Gdds) { +// closestValue = gdus +// closestIdx = i +// } +// } +// response := models.CornMaturityResponse{ +// Date: utils.ConvertDateIdxToDate(closestIdx), +// GDD: request.Gdds, +// ClosestGDD: closestValue, +// ClosestLatitude: gdds.ClosestLatitude, +// ClosestLongitude: gdds.ClosestLongitude, +// } +// return response -} +// } -- GitLab