| 502 | === 11. Mass conservation issue: stomate_turnover.f90 === |
| 503 | The mass of biomass and circ_class_biomass starts to diverge after leaf fall in stomate_turnover.f90. I fixed this by removing repetitions in a big; I couldn't locate the precise error in the original code. |
| 504 | {{{ |
| 505 | !DSGdebug_13 ! Stand level turnover (gC m-2) |
| 506 | !DSGdebug_13 ! Leaves |
| 507 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,ileaf,icarbon) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 508 | !DSGdebug_13 biomass(:,ivm,ileaf,icarbon) = biomass(:,ivm,ileaf,icarbon) - dturnover(:) |
| 509 | !DSGdebug_13 turnover(:,ivm,ileaf,icarbon) = turnover(:,ivm,ileaf,icarbon) + dturnover(:) |
| 510 | !DSGdebug_13 |
| 511 | !DSGdebug_13 ! save leaf mass change |
| 512 | !DSGdebug_13 delta_lm(:,ilage) = - dturnover(:) |
| 513 | !DSGdebug_13 |
| 514 | !DSGdebug_13 ! Roots |
| 515 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,iroot,icarbon) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 516 | !DSGdebug_13 biomass(:,ivm,iroot,icarbon) = biomass(:,ivm,iroot,icarbon) - dturnover(:) |
| 517 | !DSGdebug_13 turnover(:,ivm,iroot,icarbon) = turnover(:,ivm,iroot,icarbon) + dturnover(:) |
| 518 | !DSGdebug_13 |
| 519 | !DSGdebug_13 ! Fruit |
| 520 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,ifruit,icarbon) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 521 | !DSGdebug_13 biomass(:,ivm,ifruit,icarbon) = biomass(:,ivm,ifruit,icarbon) - dturnover(:) |
| 522 | !DSGdebug_13 turnover(:,ivm,ifruit,icarbon) = turnover(:,ivm,ifruit,icarbon) + dturnover(:) |
| 523 | !DSGdebug_13 |
| 524 | !DSGdebug_13 |
| 525 | !DSGdebug_13 ! Stand level turnover (gC m-2) |
| 526 | !DSGdebug_13 ! Leaves |
| 527 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,ileaf,initrogen) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 528 | !DSGdebug_13 biomass(:,ivm,ilabile,initrogen) = biomass(:,ivm,ilabile,initrogen) + & |
| 529 | !DSGdebug_13 recycle_leaf(ivm) * dturnover(:) |
| 530 | !DSGdebug_13 |
| 531 | !DSGdebug_13 biomass(:,ivm,ileaf,initrogen) = biomass(:,ivm,ileaf,initrogen) - dturnover(:) |
| 532 | !DSGdebug_13 turnover(:,ivm,ileaf,initrogen) = turnover(:,ivm,ileaf,initrogen) + dturnover(:) * (1. - recycle_leaf(ivm)) |
| 533 | !DSGdebug_13 |
| 534 | !DSGdebug_13 |
| 535 | !DSGdebug_13 ! Roots |
| 536 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,iroot,initrogen) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 537 | !DSGdebug_13 biomass(:,ivm,ilabile,initrogen) = biomass(:,ivm,ilabile,initrogen) + & |
| 538 | !DSGdebug_13 recycle_root(ivm) * dturnover(:) |
| 539 | !DSGdebug_13 |
| 540 | !DSGdebug_13 biomass(:,ivm,iroot,initrogen) = biomass(:,ivm,iroot,initrogen) - dturnover(:) |
| 541 | !DSGdebug_13 turnover(:,ivm,iroot,initrogen) = turnover(:,ivm,iroot,initrogen) + dturnover(:) * (1. - recycle_root(ivm)) |
| 542 | !DSGdebug_13 |
| 543 | !DSGdebug_13 |
| 544 | !DSGdebug_13 |
| 545 | !DSGdebug_13 ! Fruit |
| 546 | !DSGdebug_13 dturnover(:) = biomass(:,ivm,ifruit,initrogen) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 547 | !DSGdebug_13 biomass(:,ivm,ifruit,initrogen) = biomass(:,ivm,ifruit,initrogen) - dturnover(:) |
| 548 | !DSGdebug_13 turnover(:,ivm,ifruit,initrogen) = turnover(:,ivm,ifruit,initrogen) + dturnover(:) |
| 549 | !DSGdebug_13 |
| 550 | |
| 551 | |
| 552 | }}} |
| 553 | by |
| 554 | {{{ |
| 555 | IF (is_tree(ivm)) THEN |
| 556 | !DSGsimplify |
| 557 | DO ielem = 1,nelements |
| 558 | ! leaves |
| 559 | dturnover(:) = biomass(:,ivm,ileaf,ielem) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 560 | biomass(:,ivm,ileaf,ielem) = biomass(:,ivm,ileaf,ielem) - dturnover(:) |
| 561 | |
| 562 | IF (ielem == icarbon) THEN ! no recycling |
| 563 | turnover(:,ivm,ileaf,ielem) = turnover(:,ivm,ileaf,ielem) + dturnover(:) |
| 564 | ! save leaf mass change; carbon only |
| 565 | delta_lm(:,ilage) = - dturnover(:) |
| 566 | ELSEIF (ielem == initrogen) THEN ! recycle |
| 567 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + recycle_leaf(ivm) * dturnover(:) |
| 568 | turnover(:,ivm,ileaf, ielem) = turnover(:,ivm,ileaf, ielem) + ( un - recycle_leaf(ivm) ) * dturnover(:) |
| 569 | ELSEIF (ielem == iphosphorus) THEN ! recycle |
| 570 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + p_recycle_leaf(ivm) * dturnover(:) |
| 571 | turnover(:,ivm,ileaf, ielem) = turnover(:,ivm,ileaf, ielem) + ( un - p_recycle_leaf(ivm) ) * dturnover(:) |
| 572 | ELSE |
| 573 | STOP |
| 574 | END IF |
| 575 | |
| 576 | ! roots |
| 577 | dturnover(:) = biomass(:,ivm,iroot,ielem) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 578 | biomass(:,ivm,iroot,ielem) = biomass(:,ivm,iroot,ielem) - dturnover(:) |
| 579 | |
| 580 | IF (ielem == icarbon) THEN ! no recycling |
| 581 | turnover(:,ivm,iroot,ielem) = turnover(:,ivm,iroot,ielem) + dturnover(:) |
| 582 | ! save root mass change; carbon only |
| 583 | delta_lm(:,ilage) = - dturnover(:) |
| 584 | ELSEIF (ielem == initrogen) THEN ! recycle |
| 585 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + recycle_root(ivm) * dturnover(:) |
| 586 | turnover(:,ivm,iroot, ielem) = turnover(:,ivm,iroot, ielem) + ( un - recycle_root(ivm) ) * dturnover(:) |
| 587 | ELSEIF (ielem == iphosphorus) THEN ! recycle |
| 588 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + p_recycle_root(ivm) * dturnover(:) |
| 589 | turnover(:,ivm,iroot, ielem) = turnover(:,ivm,iroot, ielem) + ( un - p_recycle_root(ivm) ) * dturnover(:) |
| 590 | ELSE |
| 591 | STOP |
| 592 | END IF |
| 593 | |
| 594 | ! roots |
| 595 | dturnover(:) = biomass(:,ivm,iroot,ielem) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 596 | biomass(:,ivm,iroot,ielem) = biomass(:,ivm,iroot,ielem) - dturnover(:) |
| 597 | |
| 598 | IF (ielem == icarbon) THEN ! no recycling |
| 599 | turnover(:,ivm,iroot,ielem) = turnover(:,ivm,iroot,ielem) + dturnover(:) |
| 600 | ! save root mass change; carbon only |
| 601 | delta_lm(:,ilage) = - dturnover(:) |
| 602 | ELSEIF (ielem == initrogen) THEN ! recycle |
| 603 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + recycle_root(ivm) * dturnover(:) |
| 604 | turnover(:,ivm,iroot, ielem) = turnover(:,ivm,iroot, ielem) + ( un - recycle_root(ivm) ) * dturnover(:) |
| 605 | ELSEIF (ielem == iphosphorus) THEN ! recycle |
| 606 | biomass(:,ivm,ilabile,ielem) = biomass(:,ivm,ilabile,ielem) + p_recycle_root(ivm) * dturnover(:) |
| 607 | turnover(:,ivm,iroot, ielem) = turnover(:,ivm,iroot, ielem) + ( un - p_recycle_root(ivm) ) * dturnover(:) |
| 608 | ELSE |
| 609 | STOP |
| 610 | END IF |
| 611 | |
| 612 | ! Fruits |
| 613 | dturnover(:) = biomass(:,ivm,ifruit,ielem) * leaf_frac(:,ivm,ilage) * turnover_rate(:) |
| 614 | biomass(:,ivm,ifruit,ielem) = biomass(:,ivm,ifruit,ielem) - dturnover(:) |
| 615 | turnover(:,ivm,ifruit,ielem) = turnover(:,ivm,ifruit,ielem) + dturnover(:) |
| 616 | |
| 617 | ENDDO |
| 618 | !DSGsimplify |
| 619 | |
| 620 | }}} |
| 621 | |