506 enObs = length(oASSIM);
507 niter = INTEGER(NITER)[0];
517 double thresh = REAL(THRESH)[0];
518 double scale = REAL(SCALE)[0];
519 double sd1, sd2, sd3;
522 double rlnum , rlden;
529 double poldVcmax, poldVpmax, poldVpr, poldJmax;
530 double rnewVcmax, rnewVpmax, rnewVpr, rnewJmax;
531 double oldVcmax, oldVpmax, oldVpr, oldJmax;
536 for(k = 0; k <
enObs; k++){
537 assim[k] = REAL(oASSIM)[k];
538 qp[k] = REAL(oQP)[k];
539 temp[k] = REAL(oTEMP)[k];
540 rh[k] = REAL(oRelH)[k];
556 PROTECT(lists = allocVector(VECSXP,7));
557 PROTECT(names = allocVector(STRSXP,7));
559 PROTECT(mat1 = allocMatrix(REALSXP,4,niter));
560 PROTECT(mat2 = allocMatrix(REALSXP,4,niter));
562 PROTECT(accept1 = allocVector(REALSXP,1));
563 PROTECT(accept2 = allocVector(REALSXP,1));
564 PROTECT(accept3 = allocVector(REALSXP,1));
566 PROTECT(RsqBI = allocVector(REALSXP,1));
567 PROTECT(CoefBI = allocVector(REALSXP,3));
573 oldVcmax = REAL(iVCMAX)[0];
574 oldVpmax = REAL(iVPMAX)[0];
577 oldJmax = REAL(iJMAX)[0];
578 sd1 = 0.05 * oldVcmax * scale;
579 sd2 = 0.05 * oldVpmax * scale;
580 sd3 = 0.05 * oldJmax * scale;
582 while((iters < niter) && (crit > thresh)){
585 index = floor(runif(1,4));
587 rnewVcmax = oldVcmax;
588 rnewVpmax = oldVpmax;
593 rnewVcmax = oldVcmax + rnorm(0,sd1);
596 rnewVpmax = oldVpmax + rnorm(0,sd2);
602 rnewJmax = oldJmax + rnorm(0,sd3);
607 rnewVcmax,rnewVpmax,rnewVpr,
612 oldVcmax = rnewVcmax;
613 oldVpmax = rnewVpmax;
616 REAL(mat1)[n1*4] = oldVcmax;
617 REAL(mat1)[1 + n1*4] = oldVpmax;
619 REAL(mat1)[2 + n1*4] = oldJmax;
620 REAL(mat1)[3 + n1*4] = oldRsq;
621 crit = (1 - Rsq)/Rsq;
627 poldVcmax = oldVcmax;
628 poldVpmax = oldVpmax;
632 for(i = 0; i < niter; i++){
635 index = floor(runif(1,4));
637 rnewVcmax = oldVcmax;
638 rnewVpmax = oldVpmax;
643 rnewVcmax = oldVcmax + rnorm(0,sd1);
646 rnewVpmax = oldVpmax + rnorm(0,sd2);
652 rnewJmax = oldJmax + rnorm(0,sd3);
657 rnewVcmax,rnewVpmax,rnewVpr,
663 rlnum = dnorm(rnewVcmax,oldVcmax,sd1,0) +
664 dnorm(rnewVpmax,oldVpmax,sd2,0) +
666 dnorm(rnewJmax,oldJmax,sd3,0);
668 rlden = dnorm(oldVcmax,oldVcmax,sd1,0) +
669 dnorm(oldVpmax,oldVpmax,sd2,0) +
671 dnorm(oldJmax,oldJmax,sd3,0);
674 ratio = (rlnum - rlden);
678 oldVcmax = rnewVcmax;
679 oldVpmax = rnewVpmax;
684 REAL(mat2)[n2*4] = rnewVcmax;
685 REAL(mat2)[n2*4 + 1] = rnewVpmax;
687 REAL(mat2)[n2*4 + 2] = rnewJmax;
688 REAL(mat2)[n2*4 + 3] = Rsq;
694 REAL(accept1)[0] = n1;
695 REAL(accept2)[0] = n2;
696 REAL(accept3)[0] = n3;
697 REAL(RsqBI)[0] = poldRsq;
698 REAL(CoefBI)[0] = poldVcmax;
699 REAL(CoefBI)[1] = poldVpmax;
701 REAL(CoefBI)[2] = poldJmax;
704 SET_VECTOR_ELT(lists,0,RsqBI);
705 SET_VECTOR_ELT(lists,1,CoefBI);
706 SET_VECTOR_ELT(lists,2,accept1);
707 SET_VECTOR_ELT(lists,3,mat1);
708 SET_VECTOR_ELT(lists,4,mat2);
709 SET_VECTOR_ELT(lists,5,accept2);
710 SET_VECTOR_ELT(lists,6,accept3);
712 SET_STRING_ELT(names,0,mkChar(
"RsqBI"));
713 SET_STRING_ELT(names,1,mkChar(
"CoefBI"));
714 SET_STRING_ELT(names,2,mkChar(
"accept1"));
715 SET_STRING_ELT(names,3,mkChar(
"resuBI"));
716 SET_STRING_ELT(names,4,mkChar(
"resuMC"));
717 SET_STRING_ELT(names,5,mkChar(
"accept2"));
718 SET_STRING_ELT(names,6,mkChar(
"accept3"));
719 setAttrib(lists,R_NamesSymbol,names);
double RsqeC4photo(double oAssim[enObs], double oQp[enObs], double oTemp[enObs], double oRH[enObs], double Ca, double Oa, double Vcmax, double Vpmax, double Vpr, double Jmax)
Definition: eC4photo.c:728
int enObs
Definition: eC4photo.c:13