⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_input_file.cpp

📁 fdtd 3D xyzPML MPI OpenMP
💻 CPP
字号:
#include "read_input_file.h"

int readFile_fdtd_data(Input_Data *Inp_D, char *ut_nev)
{
	//ifstream declaration
	ifstream *inClientFile = NULL;
	inClientFile = new ifstream[1];
	//open the file
	inClientFile->open(ut_nev,ios::in);
	if (!*inClientFile)//return if ifstream could not open the specified file
	{
		cerr << "File: " << ut_nev << " - cannot be open" << endl;
		return 1;
	}
	
	try
	{
		#ifdef _OPENMP
			ReadFileVar<int>(inClientFile, "num_threads", &Inp_D->num_threads);
		#endif

		ReadFileVar<long>(inClientFile, "iProcs", &Inp_D->iProcs);
		ReadFileVar<long>(inClientFile, "jProcs", &Inp_D->jProcs);
		ReadFileVar<long>(inClientFile, "kProcs", &Inp_D->kProcs);

		ReadFileVar<long>(inClientFile, "nx", &Inp_D->nx);
		ReadFileVar<long>(inClientFile, "ny", &Inp_D->ny);
		ReadFileVar<long>(inClientFile, "nz", &Inp_D->nz);

		ReadFileVar<long>(inClientFile, "nPML_x_1", &Inp_D->nPML_x_1);
		ReadFileVar<long>(inClientFile, "nPML_x_2", &Inp_D->nPML_x_2);
		ReadFileVar<long>(inClientFile, "nPML_y_1", &Inp_D->nPML_y_1);
		ReadFileVar<long>(inClientFile, "nPML_y_2", &Inp_D->nPML_y_2);
		ReadFileVar<long>(inClientFile, "nPML_z_1", &Inp_D->nPML_z_1);
		ReadFileVar<long>(inClientFile, "nPML_z_2", &Inp_D->nPML_z_2);

		//the PML parameters in x,y and z direction
		ReadFileVar<double>(inClientFile, "PML_eps_r_x_1", &Inp_D->PML_eps_r_x_1);
		ReadFileVar<double>(inClientFile, "PML_mu_r_x_1", &Inp_D->PML_mu_r_x_1);
		
		ReadFileVar<double>(inClientFile, "PML_eps_r_x_2", &Inp_D->PML_eps_r_x_2);
		ReadFileVar<double>(inClientFile, "PML_mu_r_x_2", &Inp_D->PML_mu_r_x_2);
		
		ReadFileVar<double>(inClientFile, "PML_eps_r_y_1", &Inp_D->PML_eps_r_y_1);
		ReadFileVar<double>(inClientFile, "PML_mu_r_y_1", &Inp_D->PML_mu_r_y_1);
		
		ReadFileVar<double>(inClientFile, "PML_eps_r_y_2", &Inp_D->PML_eps_r_y_2);
		ReadFileVar<double>(inClientFile, "PML_mu_r_y_2", &Inp_D->PML_mu_r_y_2);
		
		ReadFileVar<double>(inClientFile, "PML_eps_r_z_1", &Inp_D->PML_eps_r_z_1);
		ReadFileVar<double>(inClientFile, "PML_mu_r_z_1", &Inp_D->PML_mu_r_z_1);
		
		ReadFileVar<double>(inClientFile, "PML_eps_r_z_2", &Inp_D->PML_eps_r_z_2);
		ReadFileVar<double>(inClientFile, "PML_mu_r_z_2", &Inp_D->PML_mu_r_z_2);
		
		ReadFileVar<double>(inClientFile, "dx", &Inp_D->dx);
		ReadFileVar<double>(inClientFile, "dy", &Inp_D->dy);
		ReadFileVar<double>(inClientFile, "dz", &Inp_D->dz);

		ReadFileVar<long>(inClientFile, "num_iter", &Inp_D->num_iter);
		
		ReadFileVar<double>(inClientFile, "limit_time", &Inp_D->limit_time);

		ReadFileVar<int>(inClientFile, "load_workspace_data", &Inp_D->load_workspace_data);
		if(Inp_D->load_workspace_data)
		{
			ReadFileVarString(inClientFile, "Path_Load_Workspace_Data", &Inp_D->Path_Load_Workspace_Data);
		}
	    
		ReadFileVar<int>(inClientFile, "save_field", &Inp_D->save_field);
		if(Inp_D->save_field)
		{
			ReadFileVar<long>(inClientFile, "nr_Save", &Inp_D->nr_Save);
			ReadFileVar<long>(inClientFile, "saveFROMinst", &Inp_D->saveFROMinst);
			ReadFileVar<long>(inClientFile, "saveTOinst", &Inp_D->saveTOinst);
			ReadFileVar<long>(inClientFile, "save_slice_nx", &Inp_D->save_slice_nx);
			if (Inp_D->save_slice_nx < 0)
			{
				cerr << "wrong save_slice_nx:  " << Inp_D->save_slice_nx << endl;
				return 1;
			}
			if (Inp_D->save_slice_nx >= Inp_D->nx)
			{
				cerr << "wrong save_slice_nx:  " << Inp_D->save_slice_nx << " >= " << Inp_D->nx  << endl;
				return 1;
			}
			ReadFileVar<long>(inClientFile, "save_slice_ny", &Inp_D->save_slice_ny);
			if (Inp_D->save_slice_ny < 0)
			{
				cerr << "wrong save_slice_ny:  " << Inp_D->save_slice_ny << endl;
				return 1;
			}
			if (Inp_D->save_slice_ny >= Inp_D->ny)
			{
				cerr << "wrong save_slice_ny:  " << Inp_D->save_slice_ny << " >= " << Inp_D->ny  << endl;
				return 1;
			}
			ReadFileVar<long>(inClientFile, "save_slice_nz", &Inp_D->save_slice_nz);
			if (Inp_D->save_slice_nz < 0)
			{
				cerr << "wrong save_slice_nz:  " << Inp_D->save_slice_nz << endl;
				return 1;
			}
			if (Inp_D->save_slice_nz >= Inp_D->nz)
			{
				cerr << "wrong save_slice_nz:  " << Inp_D->save_slice_nz << " >= " << Inp_D->nz  << endl;
				return 1;
			}
		}

		ReadFileVar<long>(inClientFile, "source_type", &Inp_D->source_type);
		ReadFileVar<long>(inClientFile, "jel_plane_wave", &Inp_D->jel_plane_wave);

		if ( Inp_D->jel_plane_wave) //plane wave
		{
			ReadFileVar<long>(inClientFile, "n_TS", &Inp_D->n_TS);

			ReadFileVar<long>(inClientFile, "nPML_1D", &Inp_D->nPML_1D);
			ReadFileVar<double>(inClientFile, "PML_eps_r_1D", &Inp_D->PML_eps_r_1D);
			ReadFileVar<double>(inClientFile, "PML_mu_r_1D", &Inp_D->PML_mu_r_1D);

			ReadFileVar<double>(inClientFile, "teta", &Inp_D->teta);
			ReadFileVar<double>(inClientFile, "phi", &Inp_D->phi);
			ReadFileVar<double>(inClientFile, "gamma", &Inp_D->gamma);
			
			ReadFileVar<double>(inClientFile, "X0", &Inp_D->X0);
			switch ( Inp_D->source_type)
			{
				case 1: //Gaussian source
					ReadFileVar<double>(inClientFile, "t0", &Inp_D->t0);
					ReadFileVar<double>(inClientFile, "tw", &Inp_D->tw);
					break;
				case 2: //Sin source
					ReadFileVar<double>(inClientFile, "omega", &Inp_D->omega);
					ReadFileVar<double>(inClientFile, "phase", &Inp_D->phase);
					ReadFileVar<double>(inClientFile, "const_alfa", &Inp_D->const_alfa);
					break;
				case 3://Gaussian-Sin source
					ReadFileVar<double>(inClientFile, "t0", &Inp_D->t0);
					ReadFileVar<double>(inClientFile, "tw", &Inp_D->tw);
					ReadFileVar<double>(inClientFile, "omega", &Inp_D->omega);
					ReadFileVar<double>(inClientFile, "phase", &Inp_D->phase);
					break;
			}
		}
		else
		{
			ReadFileVar<long>(inClientFile, "n_Coord", &Inp_D->n_Coord);
			ReadFileVarString(inClientFile, "path_name_CoordPointSource", &Inp_D->path_name_CoordPointSource);
			ReadFileVar<int>(inClientFile, "readFile_Param_Pt_Source", &Inp_D->readFile_Param_Pt_Source);
			if (Inp_D->readFile_Param_Pt_Source)
			{
				ReadFileVarString(inClientFile, "path_name_ParamPointSource", &Inp_D->path_name_ParamPointSource);
			}
			else
			{
				ReadFileVar<double>(inClientFile, "X0", &Inp_D->X0);
				switch ( Inp_D->source_type)
				{
					case 1: //Gaussian source
						ReadFileVar<double>(inClientFile, "t0", &Inp_D->t0);
						ReadFileVar<double>(inClientFile, "tw", &Inp_D->tw);
						break;
					case 2: //Sin source
						ReadFileVar<double>(inClientFile, "omega", &Inp_D->omega);
						ReadFileVar<double>(inClientFile, "phase", &Inp_D->phase);
						ReadFileVar<double>(inClientFile, "const_alfa", &Inp_D->const_alfa);
						break;
					case 3://Gaussian-Sin source
						ReadFileVar<double>(inClientFile, "t0", &Inp_D->t0);
						ReadFileVar<double>(inClientFile, "tw", &Inp_D->tw);
						ReadFileVar<double>(inClientFile, "omega", &Inp_D->omega);
						ReadFileVar<double>(inClientFile, "phase", &Inp_D->phase);
						break;
				}
			}
			ReadFileVar<int>(inClientFile, "pt_source_Ex", &Inp_D->pt_source_Ex);
			ReadFileVar<int>(inClientFile, "pt_source_Ey", &Inp_D->pt_source_Ey);
			ReadFileVar<int>(inClientFile, "pt_source_Ez", &Inp_D->pt_source_Ez);
			ReadFileVar<int>(inClientFile, "pt_source_Hx", &Inp_D->pt_source_Hx);
			ReadFileVar<int>(inClientFile, "pt_source_Hy", &Inp_D->pt_source_Hy);
			ReadFileVar<int>(inClientFile, "pt_source_Hz", &Inp_D->pt_source_Hz);
		}

		ReadFileVarString(inClientFile, "path_name_Index", &Inp_D->path_name_Index);

		ReadFileVar<long>(inClientFile, "n_Mat", &Inp_D->n_Mat);
		ReadFileVarString(inClientFile, "path_name_Mat", &Inp_D->path_name_MatParam);

		//the followed points
		ReadFileVar<int>(inClientFile, "load_foll_field_points", &Inp_D->load_foll_field_points);
		if (Inp_D->load_foll_field_points > 0)
		{
			ReadFileVar<long>(inClientFile, "n_Ind_F", &Inp_D->n_Ind_F);
			ReadFileVarString(inClientFile, "path_name_foll_field_points", &Inp_D->path_name_foll_field_points);
		}

		ReadFileVar<int>(inClientFile, "nr_cout", &Inp_D->nr_cout);
		
		//save the data
		ReadFileVarString(inClientFile, "path_save_data", &Inp_D->path_save_data);
	}
	catch( char * str )
    {
        cout << "Exception raised - " << str << ut_nev << '\n';
		return 1;
    }

	if (inClientFile)
	{
		delete [] inClientFile;
		inClientFile = NULL;
	}
	
	return 0;	

	
}

///////////////////////////////////////////////////////////////////////////////////////
//Reads from a previously opened file the value of a variable
///////////////////////////////////////////////////////////////////////////////////////
template <class T>int ReadFileVar(ifstream *inClientFile, char var_name[], T *var)
{
	//inClientFile - pointer to the previously opened File stream
	//var_name - contains the name of the variable
	//var - pointer to a long, the function will return the value of the variable in this
	
	int length_var_name = (int) strlen(var_name);
	char line[512];
	int i, j;
		
	while (inClientFile->getline(line,512))
	{
		if (line[0] != '/' && line[1] != '/')
		{
			i = 0;
			while (line[i] != '\0')
			{
				if (!strncmp(&line[i],var_name,length_var_name))
				{
					j = i + length_var_name;
					while (line[j] != '\0')
					{
						if ( line[j] >= '0' && line[j] <= '9')
						{
							*var = (T) atof(&line[j]);
							inClientFile->seekg( 0, ios_base::beg ); //back to the beginning of the file
							return 0;
						}
						j++;
					}
				}
				i++;
			}
		}
	}

	cerr << var_name << " - cannot be found" << endl;
	throw "error reading input data from: ";

	return 1; //the specified variable was not found in the file
}

///////////////////////////////////////////////////////////////////////////////////////
//Reads from a previously opened file the value of a variable
///////////////////////////////////////////////////////////////////////////////////////
int ReadFileVarString(ifstream *inClientFile, char var_name[], char **var)
{
	//inClientFile - pointer to the previously opened File stream
	//var_name - contains the name of the variable
	//var - pointer to a long, the function will return the value of the variable in this
	int length_var_name = (int) strlen(var_name);
	char line[512];
	int i, j, k;
	
	while (inClientFile->getline(line,512))
	{
		if (line[0] != '/' && line[1] != '/')
		{
			i = 0;
			while (line[i] != '\0')
			{
				if (!strncmp(&line[i],var_name,length_var_name))
				{
					j = i + length_var_name;
					while (line[j] != '\0')
					{
						if ( ( (line[j] >= 48 && line[j] <= 59 ) || // "1-9"
							   (line[j] >= 65 && line[j] <= 90 ) || // "A-Z"
							   (line[j] >= 97 && line[j] <= 122) || // "a-z"
							    line[j] == 47 || line[j] == 92 ) )    // "/" and "\"
						{  
							k = j+1;
							while (line[k] != ' ' && line[k] != '\0' && line[k] != ';') //find the end
							{
								k++;
							}
							long n_array = k-j;
							*var = new char[n_array+1];
							strncpy(*var,&line[j],n_array);//does not copy null character
							var[0][n_array] = '\0';
							inClientFile->seekg( 0, ios_base::beg ); //back to the beginning of the file
							return 0;
						}
						j++;
					}
				}
				i++;
			}
		}
	}
	
	*var = NULL;

	cerr << var_name << " - cannot be found" << endl;
	throw "error reading input data from: ";
	return 1; //the specified variable was not found in the file
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -