Example #1
0
File: 67.c Project: longinglove/NOJ
int main()
{
	char in[20];
	int a, b, c, d, e, f, temp;
	memset(in, 0, 20);
	fgets(in, 20, stdin);
	a = in[0] - 48;
	b = in[2] - 48;
	c = in[4] - 48;
	d = in[6] - 48;
	if (in[3] == '+')
	{
		e = a*d + c*b;
		f = d*b;
		temp = Sim(e,f);
		e = e/temp;
		f = f/temp;
	}
	else if (in[3] == '-')
	{
		e = a*d - c*b;
		f = d*b;
		temp = Sim(e,f);
		e = e/temp;
		f = f/temp;
	}
	if (e == 0)
		printf("0");
	else
		printf("%d/%d", e, f);
}
Example #2
0
// Add world simulation
bool Physics::addSimulation(vec pos)
{
	if (!enabled) {
		return true;
	}

	uint8_t block;
	uint8_t meta;
	map->getBlock(pos, &block, &meta);
	SimBlock simulationBlock(block, pos, meta);

	// Dont add duplicates
	for (std::vector<Sim>::iterator simIt = simList.begin(); simIt != simList.end(); simIt++) {
		vec itpos = simIt->blocks[0].pos;
		if (itpos.x() == pos.x() && itpos.y() == pos.y() && itpos.z() == pos.z()) {
			return true;
		}
	}


	// Simulating water
	if (isWaterBlock(block)) {
		simList.push_back(Sim(TYPE_WATER, simulationBlock));
		return true;
	}
	// Simulating lava
	else if (isLavaBlock(block)) {
		simList.push_back(Sim(TYPE_LAVA, simulationBlock));
		return true;
	}

	return false;
}
Example #3
0
int main (void)
{
    FILE *fd;

    double *ic, *p, *out;
    char* errbuf;
    long i, j, outd;
    long internal = 0;

    double dt = 0.00001;

    int time_steps = 1000000;
    double u[NINP];
    for (int k = 0; k < NINP; k++) u[k] = .1;

    fd = fopen("output.dat", "w");

    Sim sim = Sim(dt, NULL);
    sim.reset(out, NULL); // ic = NULL, use default start state

    for(i=0; i<time_steps; i++)
    {
        sim.step(out, u);
        fprintf(fd,"%lf ",out[0]);
        for(j=0; j<NOUT; j++)
        {
            fprintf(fd,"%lf ",out[j+1]);
        }
        fprintf(fd, "\n");
    }

    fclose(fd);

    return 0;
}
Example #4
0
// Add world simulation
bool Physics::addSimulation(vec pos)
{
  if(!enabled)
    return true;

  uint8 block; uint8 meta;
  Map::get()->getBlock(pos, &block, &meta);
  SimBlock simulationBlock(block, pos, meta);

  // Simulating water
  if(isWaterBlock(block))
  {
    simList.push_back(Sim(TYPE_WATER, simulationBlock));
    return true;
  }
  // Simulating lava
  else if(isLavaBlock(block))
  {
    simList.push_back(Sim(TYPE_LAVA, simulationBlock));
    return true;
  }

  return false;
}
Example #5
0
bool CNetWorker::Sim(ManagedData& data, ManagedData& color)
{
	//仿真结果放入color中
	int distance = 0;
	ManagedData colorone;
	color.GetAnydata(colorone, 1);				//获取任意通道数据

	int sampleblock = 0;
	BpNetdata pd[50];

	ASSERT(data.GetChannum() >= 2);
	m_LeftData.Remove(m_LeftData.GetDataSize()+1);
	m_RightData.Remove(m_RightData.GetDataSize()+1);
	data.GetAnydata(m_LeftData, 0);
	data.GetAnydata(m_RightData, 1);
	for (int i = 0; i < colorone.GetDataSize(); i++)
	{
		if (colorone[i]>0)
		{
			distance++;
		}
		else if (distance > 0)
		{
			pd[sampleblock] = CalNetData(m_LeftData.GetData() + i - distance,
				m_RightData.GetData() + i - distance ,distance);
			pd[sampleblock].sp = i - distance;				//起始位置
			pd[sampleblock].ep = i;							//终止位置
			sampleblock++;									//样本数
			distance = 0;
		}
	}
	if (sampleblock <= 0 && distance < 64)        //hwh_add
		return false;
	else if (distance == 64)
	{
		pd[sampleblock] = CalNetData(m_LeftData.GetData() ,m_RightData.GetData() , distance);
		sampleblock = 1;
	}
	double d[3];
	d[0] = pd[sampleblock - 1].Lvalue;										//选取最后一个咬牙左边通道均值
	d[1] = pd[sampleblock - 1].Rvalue;
	d[2] = pd[sampleblock - 1].LrationR;
	SetTestData(d, 3);
	int res;
	bool ret = Sim(d, res);									//计算结果
	color[0] = d[0];
	return ret;
}
Example #6
0
/** \brief The executable compute the FIM curve and by product the GW and noise response
 * \author A. Petiteau
 * \version 2.0
 * \date 25/02/2011
 * 
 *
 *
 */
int main (int argc, char * const argv[])
{
	try {
		LCTools MT;
		int nOptions(0);
		char cmd[16384];
		
		long SeedRand((long)time(NULL));
		double dtMes(0.3);
		double t0(0.);
		double tDur(63115200.0);
		int NtData(-1), tmpNtData(-1);
		int NfData(-1);
		
		int NRun(1);
		
		// *********** Help *************
		if(((argc>1)&&(strcmp(argv[1],"--help")==0))||((argc>1)&&(strcmp(argv[1],"-h")==0))){
			Coutm << " ----- HELP -----" << Endl;
			Coutm << Endl << "\tExecution :" << Endl;
			Coutm << "\t\t(./)LC2FIM [Options] ConfigFile1.xml ConfigFile2.xml ..." << Endl;
			Coutm << Endl << "\tArguments :" << Endl;
			Coutm << Endl << "\t\t * ConfigFileI.xml (required) : Configuration files. " << Endl;
			Coutm << Endl << "\tOptions :" << Endl;
			Coutm << "\t\t * -P %diP1,%diP2  : Index of parameters to study ('L' before the index mean that we have to use the log). Example : 0,1,2,3,L4,6,7 [default : None]"  << Endl ;
			Coutm << "\t\t * -cv %diP %fDeltaMin %fDeltaMax %fDeltaLogStep : Test convergence for parameter iP with value of Delta between DeltaMin and DeltaMax with step log step of DeltaLogStep [default : None]"  << Endl ;
			Coutm << "\t\t * -nf %sPSDFileName : File containing the PSD [required or option -nfc]"  << Endl ;
			Coutm << "\t\t * -nfc %sPSDFileName %sCodeColumn : File containing the PSD. Example : -nfc PSDFile.txt f,n,X,Y,Z [required]"  << Endl ;
			Coutm << "\t\t * -ca %dKeyModel : Analytic model of confusion noise  [default : None]"  << Endl ;
			Coutm << "\t\t * -I %dKey  : Method used for inverting FIM : 0-Gauss 1-SVD [default : 1]"  << Endl ;
			Coutm << "\t\t * -o %sOutFile  : Output file containing results [default: FIMResults.txt]"  << Endl ;
			Coutm << "\t\t * -tdi %sObsName : Names of TDI generators [default : X]"  << Endl ;
			Coutm << "\t\t * -t0 %ft0 : Initial time [default : " << t0 <<"]"  << Endl ;
			Coutm << "\t\t * -T %fT   : Duration [default : " << tDur  << " (= "  << tDur/LC::Yr_SI << " yr)]"  << Endl ;
			Coutm << "\t\t * -pr %diP  : Index of parameters to randomize [default : None]"  << Endl ;
			Coutm << "\t\t * -s %dseed : Seed for random gennerator. [default : current time]"  << Endl ;
			Coutm << "\t\t\t  NB: If not specified the random seed is the time machine." << Endl;
			Coutm << "\t\t * -dn \t\t: No screen display. [default: false]"  << Endl ;
			Coutm << "\t\t * -dl %sfile \t: Write standard output in a file. [default: no file]"  << Endl ;
			Coutm << "\t\t * -v \t\t: Verbose mode : display full details. [default: false]"  << Endl ;
			Coutm << "\t\t * -h \t\t: This help."  << Endl ;
			Coutm << "\t\t * -V \t\t: Version."  << Endl ;
			Coutm << Endl << " ----------------" << Endl;
			return 0;
			
		}
		
		// *********** Version *************
		if(((argc>1)&&(strcmp(argv[1],"--version")==0))||((argc>1)&&(strcmp(argv[1],"-v")==0))){
			Coutm << " ----- VERSION -----" << Endl;
			Coutm << " LC2FIM : Compute the Fisher information matrix (FIM) - LISACode package - version " << LC::LCVersion << " at " << LC::DateOfLastUpdate << Endl;
			Coutm << " ----------------" << Endl;
			return 0;
		}
		
		
		// ***** Main declaration *****
		LISACode * Sim(NULL);
		
		
		//! *** List of names of files describing the GW configuration
		char ** fNGWCfg(NULL);
		int NfNGWCfg(0);
		
		//! *** List of names of PSD files and index of columns
		char ** fNPSD(NULL);
		int NfNPSD(0);
		char *** TitColfPSD(NULL);
		int * NTitColfPSD(NULL);
		int NCharTitCol(16);
		LCDataFileRead ** fPSD(NULL);
		
		//! *** Confusion noise
		int ModelConfNoise(-1);
		LCSerie2 * ConfNoise(NULL);
		
		//! *** Name of TDI observables
		char TDINameAll[16384];
		char ** TDIName(NULL);
		int NTDI(0);
		strcpy(TDINameAll, "A,E");
		
		// *** List of pointer on read file and index of signal in it. Size NTDI
		LCDataFileRead ** fTDIPSD(NULL);
		int * ifTDIPSD(NULL);
		
		
		//! * Derivative of time data of the TDI signal of GW. Size NTDI x NtData
		double ** tSigDer(NULL);
		//! * Time data of the TDI signal of GW for parameter - delta : \f$ s(t ; \lambda - \Delta \lambda) \f$ . Size NTDI x NtData
		double ** tSigMinD(NULL);
		//! * Derivative of frequency data of the TDI signal of GW. Size : NParamToStudy x NTDI x NfData = NParamToStudy x NTDI x (NtData+1)/2 
		dcomplex *** fSigDer(NULL);
		
		//! *** FIM values
		LCMatrix FIM;
		LCMatrix CovM;
		double df;
		int iFmin, iFmax;
		dcomplex tmpRes;
		int InvFIMMethod(1);
		std::vector<double> ErrPar(0);
		
		//! *** Output (results) file
		char bNOut[16384], fNOutFIM[16384], fNOutErr[16384];
		std::ofstream fOutFIM, fOutErr;
		strcpy(bNOut, "FIMRessults");
		
		//! *** Index of parameters to be chosen randomly
		int * iParamRand(NULL);
		int NParamRand(0);
		
		//! *** Index of parameters to be chosen randomly
		int * iParStudy(NULL);
		int NParStudy(0);
		bool * lnParStudy(NULL);
		double * ParStuValue(NULL);
		double * ParStuDelta(NULL);
		
		//! *** For testing convergence
		double ConvDMin(-1.), ConvDMax(-1.), ConvDLogStep(-1.);
		int ConviP(-1);
		
		//! HERE I HARD CODED THE TOTAL NUMBER OF PARAMETERS : GALBIN
		int NParTot(12);
		
		// ***** Read options *****
		for(int iarg=1; iarg<argc; iarg++){
			
			if((argc>1)&&(strcmp(argv[iarg],"-P")==0)){
				//! **** Read list of parameters to study
				char tmpIndPar[1064];
				int iPtmp(0);
				char ** tmpWordInd(NULL);
				
				strcpy(tmpIndPar, argv[iarg+1]);
				MT.wextractcoma(tmpIndPar, iPtmp, tmpWordInd, NParStudy, 10);
				
				iParStudy = (int*) MT.AllocMemory(NParStudy*sizeof(int));
				lnParStudy = (bool*) MT.AllocMemory(NParStudy*sizeof(bool));
				ParStuValue = (double*) MT.AllocMemory(NParStudy*sizeof(double));
				ParStuDelta = (double*) MT.AllocMemory(NParStudy*sizeof(double));
				for(int i=0; i<NParStudy; i++){
					if(tmpWordInd[i][0] == 'L'){
						iParStudy[i] = atoi(tmpWordInd[i]+1);
						lnParStudy[i] = true;
					}else{
						iParStudy[i] = atoi(tmpWordInd[i]);
						lnParStudy[i] = false;
					}
					ParStuValue[i] = 0.;
					ParStuDelta[i] = 0.;
				}
				
				for(int i=0; i<NParStudy; i++)
					MT.Free(tmpWordInd[i], 10*sizeof(char));
				MT.Free(tmpWordInd, NParStudy*sizeof(char*));
				
				nOptions +=2;
			}
			
			if((argc>1)&&(strcmp(argv[iarg],"-cv")==0)){
				if(argc-iarg<4)
					throw std::invalid_argument("ERROR : Need 4 parameters for testinf the convergence !");
				ConviP = atoi(argv[iarg+1]);
				ConvDMin = atof(argv[iarg+2]);
				ConvDMax = atof(argv[iarg+3]);
				ConvDLogStep = atof(argv[iarg+4]);
				nOptions += 5;
			}
			
			if((argc>1)&&(strcmp(argv[iarg],"-nf")==0)){
				//! **** Read name of one PSD noise file in option and allocate memory for list of title
				NfNPSD++;
				
				fNPSD = (char**) MT.ReAllocMemory(fNPSD, (NfNPSD-1)*sizeof(char*), NfNPSD*sizeof(char*));
				fNPSD[NfNPSD-1] = (char*)MT.AllocMemory(2048*sizeof(char));
				strcpy(fNPSD[NfNPSD-1], argv[iarg+1]);
				
				TitColfPSD = (char***) MT.ReAllocMemory(TitColfPSD, (NfNPSD-1)*sizeof(char**), NfNPSD*sizeof(char**));
				NTitColfPSD = (int*) MT.ReAllocMemory(NTitColfPSD, (NfNPSD-1)*sizeof(int), NfNPSD*sizeof(int));
				TitColfPSD[NfNPSD-1] = NULL;
				NTitColfPSD[NfNPSD-1] = 0;
				
				nOptions +=2;
			}
			
			if((argc>1)&&(strcmp(argv[iarg],"-nfc")==0)){
				
				//! **** Read name of one PSD noise file in option and allocate memory for list of title
				NfNPSD++;
				
				fNPSD = (char**) MT.ReAllocMemory(fNPSD, (NfNPSD-1)*sizeof(char*), NfNPSD*sizeof(char*));
				fNPSD[NfNPSD-1] = (char*)MT.AllocMemory(2048*sizeof(char));
				strcpy(fNPSD[NfNPSD-1], argv[iarg+1]);
				
				TitColfPSD = (char***) MT.ReAllocMemory(TitColfPSD, (NfNPSD-1)*sizeof(char**), NfNPSD*sizeof(char**));
				NTitColfPSD = (int*) MT.ReAllocMemory(NTitColfPSD, (NfNPSD-1)*sizeof(int), NfNPSD*sizeof(int));
				TitColfPSD[NfNPSD-1] = NULL;
				NTitColfPSD[NfNPSD-1] = 0;
				int ipIS(0);
				MT.wextractcoma(argv[iarg+2], ipIS, TitColfPSD[NfNPSD-1], NTitColfPSD[NfNPSD-1], NCharTitCol);
				
				nOptions +=3;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-ca")==0)){
				ModelConfNoise = atof(argv[iarg+1]); 
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-tdi")==0)){
				// ***** Read gravitational waves file in option
				strcpy(TDINameAll, argv[iarg+1]);
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-o")==0)){
				// ***** Read base name of output file in option
				strcpy(bNOut, argv[iarg+1]);
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-I")==0)){
				InvFIMMethod = atoi(argv[iarg+1]);
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-t0")==0)){
				t0 = atof(argv[iarg+1]); 
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-T")==0)){
				tDur = atof(argv[iarg+1]); 
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-r")==0)){
				NRun = atoi(argv[iarg+1]);
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-pr")==0)){
				NParamRand++;
				iParamRand = (int*) MT.ReAllocMemory(iParamRand, (NParamRand-1)*sizeof(int), NParamRand*sizeof(int));
				iParamRand[NParamRand-1] = atof(argv[iarg+1]); 
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-s")==0)){
				SeedRand = atoi(argv[iarg+1]);
				nOptions +=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-dn")==0)){
				MT.unsetDisp();
				nOptions++;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-dl")==0)){
				MT.setDispInFile(argv[iarg+1],true);
				nOptions+=2;
			}
			if((argc>1)&&(strcmp(argv[iarg],"-V")==0)){
				MT.setDispDetails();
				nOptions++;
			}
		} 
		MT.setRandSeed(SeedRand);
		
		
		Coutm << "FIM study for parameters : " ;
		for(int iP=0; iP<NParStudy; iP++){
			if(lnParStudy[iP]){
				Coutm << " log(" << iParStudy[iP] << ")";
			}else{
				Coutm << " " << iParStudy[iP];
			}
		}
		Coutm << Endl;
		
		//! ***** Read configuration files in arguments
		
		for(int ia=1+nOptions; ia<argc; ia++){
			NfNGWCfg++;
			fNGWCfg = (char**)MT.ReAllocMemory(fNGWCfg, (NfNGWCfg-1)*sizeof(char*), NfNGWCfg*sizeof(char*));
			fNGWCfg[NfNGWCfg-1] = (char*)MT.AllocMemory(2048*sizeof(char));
			strcpy(fNGWCfg[NfNGWCfg-1], argv[ia]);
		}
		
		//! *** Display for checking which files we are using
		Coutm << "Configuration files : " << Endl;
		for(int i=0; i<NfNGWCfg; i++){
			Coutm << "\t + " << fNGWCfg[i] ; MT.CheckFile("", fNGWCfg[i]);
		}
		
		
		
		//! ***** Read the bloc name of TDI generators and obtain the individual names and the number of generators
		int ipTDINameAll(0);
		MT.wextractcoma(TDINameAll, ipTDINameAll, TDIName, NTDI, NCharTitCol);
		Coutm << "TDI generators : ";
		for(int i=0; i<NTDI; i++)
			Coutm << " " << TDIName[i];
		Coutm << Endl;
		
		
		//! ***** Allocate memory 
		tSigDer = (double **) MT.AllocMemory(NTDI*sizeof(double*));
		tSigMinD = (double **) MT.AllocMemory(NTDI*sizeof(double*));
		fSigDer = (dcomplex ***) MT.AllocMemory(NParStudy*sizeof(dcomplex**));
		FIM.init(&MT, NParStudy, NParStudy);
		CovM.init(&MT, NParStudy, NParStudy);
		ErrPar.resize(NParStudy,0.);
		fTDIPSD = (LCDataFileRead **) MT.AllocMemory(NTDI*sizeof(LCDataFileRead*));
		ifTDIPSD = (int *) MT.AllocMemory(NTDI*sizeof(int));
		for(int iP=0; iP<NParStudy; iP++){
			fSigDer[iP] = (dcomplex **) MT.AllocMemory(NTDI*sizeof(dcomplex*));
		}
		
		//! ***** Initialization of memory 
		for(int i=0; i<NTDI; i++){
			tSigDer[i] = NULL;
			tSigMinD[i] = NULL;
			fTDIPSD[i] = NULL;
			ifTDIPSD[i] = 0;
			for(int iP=0; iP<NParStudy; iP++)
				fSigDer[iP][i] = NULL; 
		}
		for(int iP=0; iP<NParStudy; iP++){
			for(int iP2=0; iP2<NParStudy; iP2++){
				FIM(iP,iP2,0.);
				CovM(iP,iP2,0.);
			}
		}
		
		
		//! ***** Read the PSD files
		fPSD = (LCDataFileRead **) MT.AllocMemory(NfNPSD*sizeof(LCDataFileRead*));
		for(int iF=0; iF<NfNPSD; iF++){
			fPSD[iF] = new LCDataFileRead(&MT, fNPSD[iF]);
			fPSD[iF]->init();
			
			//! *** If we don't have the name of columns (not specified in option) try to find them in the header
			if(TitColfPSD[iF] == NULL)
				fPSD[iF]->getHeader(TitColfPSD[iF], NTitColfPSD[iF], NCharTitCol);
			
			//! ** Loop over the TDI generator trying to match the name with the column of the file
			for(int iTDI=0; iTDI<NTDI; iTDI++){
				for(int iC=0; iC<NTitColfPSD[iF]; iC++){
					if(MT.wcmp(TDIName[iTDI], TitColfPSD[iF][iC])){
						fTDIPSD[iTDI] = fPSD[iF];
						ifTDIPSD[iTDI] = iC - 1 + fPSD[iF]->ReadFirstCol();
					}
				}
			}
		}
		
		//! *** Display for checking PSD files
		Coutm << "PSD noise files :" << Endl;
		for(int iTDI=0; iTDI<NTDI; iTDI++){
			if(fTDIPSD[iTDI] != NULL){
				Coutm << Endl << "\t - " << TDIName[iTDI] << " : signal " << ifTDIPSD[iTDI] << " of :";
				fTDIPSD[iTDI]->ControlDisplay();
			}else{
				std::cerr << "ERROR : No PSD of noises for TDI " << TDIName << " !" << Endl;
				throw std::invalid_argument("ERROR : A PSD of noise file is missing for one TDI !");
			}
		}
		
		
		//! *** Load Confusion noise if needed
		if(ModelConfNoise>=0)
			LoadConfusionNoise(&MT, ConfNoise, ModelConfNoise, fTDIPSD[0]->getx0(), fTDIPSD[0]->getxend(), fTDIPSD[0]->getdx());		
		
		
		//! **** Open and initialize the FIM output file
		sprintf(fNOutFIM, "%s-FIM.txt", bNOut);
		fOutFIM.open(fNOutFIM);
		
		//! *** Write header of FIM output file
		fOutFIM << "#i";
		for(int iP=0; iP<NParTot; iP++)
			fOutFIM << " Par" << iP;
		if(ConviP>=0)
			fOutFIM << " D_" << ConviP << " P-D_" << ConviP << " P+D_" << ConviP;
		for(int iP1=0; iP1<NParStudy; iP1++)
			for(int iP2=0; iP2<NParStudy; iP2++)
				fOutFIM << " FIM" << iParStudy[iP1] << iParStudy[iP2];
		for(int iP1=0; iP1<NParStudy; iP1++)
			for(int iP2=0; iP2<NParStudy; iP2++)
				fOutFIM << " Cov" << iParStudy[iP1] << iParStudy[iP2];
		fOutFIM << Endl;
		fOutFIM.precision(12);
		
		
		//! **** Open and initialize the Err output file
		sprintf(fNOutErr, "%s-Err.txt", bNOut);
		fOutErr.open(fNOutErr);
		
		//! *** Write header of Err output file
		fOutErr << "#i";
		for(int iP=0; iP<NParTot; iP++)
			fOutErr << " Par" << iP;
		for(int iP=0; iP<NParStudy; iP++)
			fOutErr << " Err" << iParStudy[iP];
		fOutErr << Endl;
		fOutErr.precision(12);
		
		
		if(ConviP>=0)
			NRun = MT.ifloor((log10(ConvDMax)-log10(ConvDMin))/ConvDLogStep);
		
		for(int iRun=0; iRun<NRun; iRun++){
			
			std::cerr << "Run : " << iRun << " / " << NRun << Endl;
			
			//! ********* Compute the derivative of time signal : loop over the parameters to study
			
			for(int iP=0 ; iP<NParStudy; iP++){
				double DeltaPar;
				
				//! ***** Two steps : one for plus Delta and one for minus Delta
				for(int iD=0; iD<2; iD++){
					
					//! *** Allocation of the simulator
					Sim  = new LISACode(&MT);
					Sim->setTimeInfo(dtMes, t0, tDur);
					
					//! *** Configure the simulator using the configuration files
					for(int i=0; i<NfNGWCfg; i++)
						Sim->config(fNGWCfg[i]);
					
					//! *** Update time informations or check that there are the same as the previous run
					if((iRun==0)&&(iP==0)&&(iD==0)){
						t0 = Sim->gett0();
						dtMes = Sim->getdtMes();
					}else{
						if(!MT.deq(t0,Sim->gett0()))
							throw std::invalid_argument("ERROR : The initial time changes !");
						if(!MT.deq(dtMes,Sim->getdtMes()))
							throw std::invalid_argument("ERROR : The time step changes !");
					}
					
					
					//! *** Choose randomly the parameters to randomize
					if(iRun!=0){
						for(int iP=0; iP<NParamRand; iP++){
							//! *** THIS CONDITION IS FOR VERIFICATION BINARIES (if inclination = 60 deg, then randomize it) SO IT SHOULD BE REMOVED FOR ANY OTHER SOURCE !!! 
							if((iParamRand[iP]!=3)||(((iParamRand[iP]==3))&&(MT.deq(Sim->GWgetParam(0,iParamRand[iP]),60.*M_PI/180.))))
								Sim->GWRandParam(iParamRand[iP]);
						}
					}
					
					
					//! *** Write parameters value in the output files
					if((iP==0)&&(iD==0)){
						fOutFIM << iRun;
						Sim->GWDispParam(&fOutFIM);
						fOutErr << iRun;
						Sim->GWDispParam(&fOutErr);
						
					}
					
					//! *** Here add plus or minus Delta to the parameter and get Delta
					ParStuValue[iP] = Sim->GWgetParam(0, iParStudy[iP]);
					if((iParStudy[iP] <= 0.)&&(lnParStudy[iP])){
						lnParStudy[iP] = false;
						Coutm << "WARNING : The LOG consideration of parameter " << lnParStudy[iP] << " is CANCELLED because the value is equal to 0 or negative !!!" << Endl;
						std::cerr << "WARNING : The LOG consideration of parameter " << lnParStudy[iP] << " is CANCELLED because the valueis equal to 0 or negative !!!" << Endl;
					}
					
					if(ConviP==iParStudy[iP]){
						//! *** Testing convergence
						DeltaPar = pow(10., log10(ConvDMin) + iRun*ConvDLogStep);
						if(iD == 0){
							fOutFIM << " " << DeltaPar;
							Sim->GWAddExtDeltaParam(iParStudy[iP], -DeltaPar);
						}else{
							Sim->GWAddExtDeltaParam(iParStudy[iP], +DeltaPar);
						}
						fOutFIM << " " << Sim->GWgetParam(0, iParStudy[iP]);
					}else{
						//! *** Standard FIM
						if(iD == 0)
							DeltaPar = Sim->GWAddDeltaParam(iParStudy[iP], -1.0);
						else
							DeltaPar = Sim->GWAddDeltaParam(iParStudy[iP], +1.0);
					}
					ParStuDelta[iP] = DeltaPar;
					
					
					
					//! *** Initialization of the simulator
					Sim->init();
					
					
					//! *** Add output series with allocation of the series if needed
					for(int i=0; i<NTDI; i++){
						Sim->AddSerieOut(TDIName[i], 1, tmpNtData, ((iRun==0)&&(iP==0)) );
						if(NtData == -1)
							NtData = tmpNtData; 
						if(NtData != tmpNtData){
							Coutm << "ERROR : The numbers of data in TDI time vector are not the same : previously it was " << NtData << "but it's " << tmpNtData << "for the last one (" << TDIName[i] << ") !" << Endl;
							throw std::invalid_argument("ERROR : The numbers of data in TDI time vector are not the same !");
						}
					}
					
					//! *** Link output series
					if(iD==0){
						for(int i=0; i<NTDI; i++)
							Sim->LinkSerieOut(i, tSigMinD[i]);
					}else{
						for(int i=0; i<NTDI; i++)
							Sim->LinkSerieOut(i, tSigDer[i]);
					}
					
					//Sim->DispInfo("");
					
					
					//! *** Compute the time series : Run the simulator
					Sim->Run();
					
					//! *** Delete the simulator
					delete Sim;
					Sim = NULL;
					
				}
				
				//! *** Compute the centered derivative
				for(int iTDI=0; iTDI<NTDI; iTDI++)
					for(int i=0; i<NtData; i++)
						tSigDer[iTDI][i] = ( tSigDer[iTDI][i] - tSigMinD[iTDI][i] ) / DeltaPar; 
				
				Coutm << "Delta of parameter " << iP << " = " << DeltaPar << Endl;
				
				//! *** Compute the Fourier transform of the derivative
				
				//! ****** Compute the Fourrier transform
				//! *** Prepare computation
				if((iRun==0)&&(iP==0)){
					NfData = MT.getNfFTreal(NtData);
					df = 1./(dtMes*NtData);
					iFmin = MAX(MT.iceil(fTDIPSD[0]->getx0()/df), 0)+2;
					iFmax = MIN(MT.iceil(fTDIPSD[0]->getxend()/df), NfData)-2;
				}
				if(iRun==0)
					for(int i=0; i<NTDI; i++)
						fSigDer[iP][i] = (dcomplex*) MT.AllocMemory(NfData*sizeof(dcomplex));
				
				//! *** Compute Fourrier transform
				MT.FTMakeFwdMulti(tSigDer, fSigDer[iP], NtData, NTDI);
				
				//! *** Normalize Fourrier transform
				for(int iF=0; iF<NfData; iF++)
					for(int iS=0; iS<NTDI; iS++)
						fSigDer[iP][iS][iF] *= dtMes;
				
				Coutm << "Frequency frame : df = " << df << " Hz ,  Fmin = " << iFmin*df << " Hz ,  Fmax = " << iFmax*df << " Hz" << Endl; 
				
				//! *** If we have to consider the logartihm instead of the value itself, we need to multiply the derivative by the value
				if(lnParStudy[iP]){
					for(int iF=0; iF<NfData; iF++)
						for(int iS=0; iS<NTDI; iS++)
							fSigDer[iP][iS][iF] *= ParStuValue[iP];
				}
				
			}
			
			
			//! ****** Computation of Fisher Information Matrix 
			for(int iP1=0; iP1<NParStudy; iP1++){
				for(int iP2=0; iP2<NParStudy; iP2++){
					double tmpFIM(0.);
					for(int iS=0; iS<NTDI; iS++){
						tmpRes = 0.;
						for(int iF=iFmin; iF<iFmax; iF++){
							//if(iS==0)
							//	Coutm << iF << " " << iF*df << " " << real(fSig[iS][iF]) << " " << imag(fSig[iS][iF]) << " " << real(fSig[iS][iF] * conj(fSig[iS][iF])) << " " << fTDIPSD[iS]->gData(ifTDIPSD[iS], iF*df, LIN, 0) << " " << real(tmpRes) << " " << imag(tmpRes) << Endl;
							if(ConfNoise != NULL)
							tmpRes += fSigDer[iP1][iS][iF] * conj(fSigDer[iP2][iS][iF]) / (fTDIPSD[iS]->gData(ifTDIPSD[iS], iF*df, LIN, 0) + ConfNoise->gData(iF*df, LIN, 0));
							else
							tmpRes += fSigDer[iP1][iS][iF] * conj(fSigDer[iP2][iS][iF]) / fTDIPSD[iS]->gData(ifTDIPSD[iS], iF*df, LIN, 0);
						}
						tmpFIM += 4.0 * df * tmpRes.real();
					}
					FIM(iP1,iP2,tmpFIM);
				}
			}
			
			
			//! **** Display Fisher matrix
			Coutm << "============================ Fisher Information Matrix ============================" << Endl;
			Coutm << FIM << Endl;
			
			//! ** Mathematica format 
			Coutm << "FIM = ";
			for(int iP1=0; iP1<NParStudy; iP1++){
				if(iP1==0)
					Coutm << "{{";
				else 
					Coutm << ",{";
				for(int iP2=0; iP2<NParStudy; iP2++){
					if(iP2==0)
						Coutm <<  FIM(iP1,iP2);
					else
						Coutm << "," <<  FIM(iP1,iP2);
				}
				Coutm << "}";
			}
			Coutm << "}" << Endl;
			
			//! **** Record FIM
			for(int iP1=0; iP1<NParStudy; iP1++)
				for(int iP2=0; iP2<NParStudy; iP2++)
					fOutFIM << " " <<  FIM(iP1,iP2);
			
			
			
			
			//! ***** Invert Fisher matrix 
			CovM = FIM.Inv(InvFIMMethod);
			
			Coutm << "============================ Covariance Matrix ============================" << Endl;
			Coutm << CovM << Endl;
			
			
			//! ***** Normalization of covariance matrix
			for(int iP=0; iP<NParStudy; iP++){
				for(int jP=0; jP<NParStudy; jP++){
					if(iP!=jP)
						CovM(iP, jP, CovM(iP,jP)/sqrt(CovM(iP,iP)*CovM(jP,jP)) );
				}
			}
			
			Coutm << "============================ Normalized covariance Matrix ============================" << Endl;
			Coutm << CovM << Endl;
			
			//! **** Record Covariance matrix
			for(int iP1=0; iP1<NParStudy; iP1++)
				for(int iP2=0; iP2<NParStudy; iP2++)
					fOutFIM << " " <<  CovM(iP1,iP2);
			fOutFIM << Endl;
			
			
			//! ***** Errors on parameters
			for(int iP=0; iP<NParStudy; iP++){
				if(lnParStudy[iP])
					ErrPar[iP] = sqrt(CovM(iP,iP))*ParStuValue[iP];
				else
					ErrPar[iP] = sqrt(CovM(iP,iP));
			}
			
			//! *** Display errors
			Coutm << "============================ Errors on parameters ============================" << Endl;
			for(int iP=0; iP<NParStudy; iP++)
				Coutm << "Par " << iParStudy[iP] << " = " << ParStuValue[iP] << " @ " << ErrPar[iP] << Endl; 
			
			//! *** Record errors
			for(int iP=0; iP<NParStudy; iP++)
				fOutErr << " " << ErrPar[iP];
			fOutErr << Endl;
		}
		
		fOutFIM.close();
		fOutErr.close();
		
		
		// ***** Free memory *****
		
		if(Sim != NULL)
			delete Sim;
		Sim = NULL;
		
		
		if(fNGWCfg != NULL){
			for(int iF=0; iF<NfNGWCfg; iF++)
				if(fNGWCfg[iF] != NULL)
					MT.Free(fNGWCfg[iF], 2048*sizeof(char));
			MT.Free(fNGWCfg, NfNGWCfg*sizeof(char*));
		}
		
		if(fNPSD != NULL){
			for(int i=0; i<NfNPSD; i++)
				if(fNPSD[i] != NULL)
					MT.Free(fNPSD[i], 2048*sizeof(char));
			MT.Free(fNPSD, NfNPSD*sizeof(char*));
		}
		
		if(TitColfPSD != NULL){
			for(int i=0; i<NfNPSD; i++){
				if(TitColfPSD[i] != NULL){
					for(int j=0; j<NTitColfPSD[i]; j++)
						MT.Free(TitColfPSD[i][j], NCharTitCol*sizeof(char));
				}
				MT.Free(TitColfPSD[i], NTitColfPSD[i]*sizeof(char*));
			}
			MT.Free(TitColfPSD, NfNPSD*sizeof(char**));
			MT.Free(NTitColfPSD, NfNPSD*sizeof(int));
		}
		
		if(fPSD != NULL){
			for(int i=0; i<NfNPSD; i++)
				if(fPSD[i] != NULL)
					delete fPSD[i];
			MT.Free(fPSD, NfNPSD*sizeof(LCDataFileRead*));
		}
		
		if(ConfNoise != NULL)
			delete ConfNoise;
		
		if(TDIName != NULL){
			for(int i=0; i<NTDI; i++)
				if(TDIName[i] != NULL)
					MT.Free(TDIName[i], 16*sizeof(char));
			MT.Free(TDIName, NTDI*sizeof(char*));
		}
		
		if(fTDIPSD != NULL)
			MT.Free(fTDIPSD, NTDI*sizeof(LCDataFileRead*));
		
		if(ifTDIPSD != NULL)
			MT.Free(ifTDIPSD, NTDI*sizeof(int));
		
		if(tSigDer != NULL){
			for(int i=0; i<NTDI; i++)
				if(tSigDer[i] != NULL)
					MT.Free(tSigDer[i], NtData*sizeof(double));
			MT.Free(tSigDer, NTDI*sizeof(double*));
		}
		
		if(tSigMinD != NULL){
			for(int i=0; i<NTDI; i++)
				if(tSigMinD[i] != NULL)
					MT.Free(tSigMinD[i], NtData*sizeof(double));
			MT.Free(tSigMinD, NTDI*sizeof(double*));
		}
		
		if(fSigDer != NULL){
			for(int iP=0; iP<NParStudy; iP++){
				if(fSigDer[iP] != NULL)
					for(int i=0; i<NTDI; i++)
						if(fSigDer[iP][i] != NULL)
							MT.Free(fSigDer[iP][i], NfData*sizeof(dcomplex));
				MT.Free(fSigDer[iP], NTDI*sizeof(dcomplex*));
			}
			MT.Free(fSigDer, NParStudy*sizeof(dcomplex*));
		}
		
		if(iParamRand != NULL)
			MT.Free(iParamRand,NParamRand*sizeof(int));
		
		if (MT.Disp())
			Coutm << Endl << "End." << Endl;
	}
	
	
	catch(std::exception & e ) {
		std::cerr << "LC2FIM: error: " << e.what()<<Endl;
		std::cerr << "LC2FIM: abort!" << Endl;
		exit(1);
	}
	return(0);
};