Esempio n. 1
0
double log_fc_eta3(double eta, double tau_epsilon, double a_vp, 
		   double b_vp, double* conc, double* time, double kep, 
		   double ktrans, int T, double* settings) {
  double p = 0.0;
  double a, b;
  int t;
  for (t=0; t<T; t++) {
    a = aif(time[t], settings);
    b = conc[t] - ktrans * convterm(kep, time[t], settings);
    p -= 0.5 * tau_epsilon * (a * eta - b) * (a * eta - b);
  }
  p += (a_vp - 1) * log(eta) + (b_vp - 1) * log(1 - eta);
  return p;
}
Esempio n. 2
0
double extraterm(double vp, double time, double* settings) {
  return(vp * aif(time, settings));
}
Esempio n. 3
0
int RSOSObs<T,U>::parallelReceive()
{
	if(!this->MPIEnabled)
		return NOTALLOWED;

#ifndef NOBRANCH
	cavgQ.clear();
	cavgQ2.clear();
	avgH.clear();
	avgH2.clear();
	avgN.clear();
	avgN2.clear();
#endif

	//Wait for all processes to get here
	MPI_Barrier(MPI_COMM_WORLD);
	for(int procId=1;procId<this->procCount;procId++)
	{
		int tag,recv;
		MPI_Status stat;

		MPI_Send(&recv,1,MPI_INT,procId,tag,MPI_COMM_WORLD);
#if DEBUG >= 2
		fprintf(this->log,"RSOSObs Sending notification to process:%d\n",procId);
		fflush(this->log);
#endif

		MPI_Recv(&this->ltime,1,MPI_UNSIGNED,procId,tag,MPI_COMM_WORLD,&stat);

		this->freeEnergy.mpiReceive(procId);

		this->Qx.mpiReceive(procId);
		this->Qx2.mpiReceive(procId);

		this->eH.mpiReceive(procId);
		this->eN.mpiReceive(procId);

#ifndef NOBRANCH
		int lsize;
		MPI_Recv(&lsize,1,MPI_INT,procId,tag,MPI_COMM_WORLD,&stat);
		vector<vect<double>> tempcQ(lsize);
		vector<vect<double>> tempcQ2(lsize);
		if(this->cavgQ.size()<lsize)
		{
			cavgQ.resize(lsize);
			cavgQ2.resize(lsize);
			avgH.resize(lsize);
			avgH2.resize(lsize);
			avgN.resize(lsize);
			avgN2.resize(lsize);
		}

		MPI_Recv(tempcQ.data(),lsize*3,MPI_DOUBLE,procId,tag,MPI_COMM_WORLD,&stat);
		MPI_Recv(tempcQ2.data(),lsize*3,MPI_DOUBLE,procId,tag,MPI_COMM_WORLD,&stat);

		vector<double> tempH(lsize), tempH2(lsize);
		vector<int> tempN(lsize), tempN2(lsize);
		MPI_Recv(tempH.data(),lsize,MPI_DOUBLE,procId,tag,MPI_COMM_WORLD,&stat);
		MPI_Recv(tempH2.data(),lsize,MPI_DOUBLE,procId,tag,MPI_COMM_WORLD,&stat);
		MPI_Recv(tempN.data(),lsize,MPI_INT,procId,tag,MPI_COMM_WORLD,&stat);
		MPI_Recv(tempN2.data(),lsize,MPI_INT,procId,tag,MPI_COMM_WORLD,&stat);

		for(int i = 0;i<lsize;i++)
		{
			cavgQ[i].x += tempcQ[i].x;
			cavgQ2[i].x += tempcQ2[i].x;
			avgH[i] += tempH[i];
			avgH2[i] += tempH2[i];
			avgN[i] += tempN[i];
			avgN2[i] += tempN2[i];
		}


#endif

#if DEBUG >= 2
		fprintf(this->log,"RSOSObs Finished receiving from process:%d\n",procId);
		fflush(this->log);
#endif
	}

	//Compute observables
	this->Zcount++;
	double it = 1.0/(this->ltime*this->dt);
	double lqx = (Qx/freeEnergy).value();
	this->Q.x += it*lqx;
	this->Q2.x += it*it*lqx*lqx;

	double lvx = it*((Qx2/freeEnergy).value() - lqx*lqx);
	this->V.x += lvx;
	this->V2.x += lvx*lvx;

	double offset = log(this->totalWalkers);
	double temp = it*(freeEnergy.logValue()-offset);
	this->fe += temp;
	this->fe2 += temp*temp;

	double lqN = (eN/freeEnergy).value()*it;
	double lqH = (eH/freeEnergy).value()*it;
	this->gN += lqN;
	this->N2 += lqN*lqN;
	this->H += lqH;
	this->H2 += lqH*lqH;

#ifndef NOBRANCH
	//Average Trajectory
	int lsize = cavgQ.size();
	double ait = it/lsize;
	double avgqx = 0.0, avgqx2 = 0.0;

	double avgh = 0.0, avgh2 = 0.0;
	double avgn = 0.0, avgn2 = 0.0;

#if 1
	ofstream dif(this->baseFileName + "A",std::ofstream::out);
#endif
	for(int i = 0;i<lsize;i++)
	{
		double lqx = cavgQ[i].x/this->totalWalkers;
		avgqx += lqx;
		double lqx2 = (cavgQ2[i].x/totalWalkers - lqx*lqx);
		avgqx2 += lqx2;

		double lh = (avgH[i]/totalWalkers);
		avgh += lh;
		double lh2 = (avgH2[i]/totalWalkers - lh*lh);
		avgh2 += lh2;

		double ln = (avgN[i]/totalWalkers);
		avgn += ln;
		double ln2 = (avgN2[i]/totalWalkers - ln*ln);
		avgn2 += ln2;
#if 1
		dif<<i<<" "<<lqx*it<<" "<<lqx2*it<<
				" "<<lh*it<<" "<<ln*it<<endl;
#endif
	}
#if 1
	dif<<"--------------------------\n";
	dif.close();
#endif

	avgqx2 *= ait;
	avgqx *= ait;
	avgh *= ait;
	avgn2 *= ait;
	avgn *= ait;

#endif

	lqx*=it;
	ofstream wif(this->baseFileName + "E",std::ofstream::app);
	wif<<ltime*dt<<" "<<temp<<" "<<lqx<<" "<<lvx
			<<" "<<lqN<<" "<<lqH<<endl;
	wif.close();
#ifndef NOBRANCH
	ofstream aif(this->baseFileName + "D",std::ofstream::app);
	aif<<(this->ltime*this->dt)*lsize<<" "<<avgqx<<" "<<avgqx2
			<<" "<<avgh<<" "<<avgh2<<" "<<avgn<<" "<<avgn2<<endl;
	aif.close();
#endif

	//Reset for next collection
	freeEnergy.resetValue();
	Qx.resetValue();
	Qx2.resetValue();
	eH.resetValue();
	eN.resetValue();

#ifndef NOBRANCH
#endif

}