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

📄 mcmlmain.c

📁 蒙特卡罗(Monte Carlo)方法
💻 C
字号:
/*********************************************************** *  Copyright Univ. of Texas M.D. Anderson Cancer Center *  1992. * *	main program for Monte Carlo simulation of photon *	distribution in multi-layered turbid media. * ****//**** *	THINKCPROFILER is defined to generate profiler calls in  *	Think C. If 1, remember to turn on "Generate profiler  *	calls" in the options menu.  ****/#define THINKCPROFILER 0	/* GNU cc does not support difftime() and CLOCKS_PER_SEC.*/#define GNUCC 0#if THINKCPROFILER#include <profile.h>#include <console.h>#endif#include "mcml.h"/*	Declare before they are used in main(). */FILE *GetFile(char *);short ReadNumRuns(FILE* );void ReadParm(FILE* , InputStruct * );void CheckParm(FILE* , InputStruct * );void InitOutputData(InputStruct, OutStruct *);void FreeData(InputStruct, OutStruct *);double Rspecular(LayerStruct * );void LaunchPhoton(double, LayerStruct *, PhotonStruct *);void HopDropSpin(InputStruct  *,PhotonStruct *,OutStruct *);void SumScaleResult(InputStruct, OutStruct *);void WriteResult(InputStruct, OutStruct, char *);/*********************************************************** *	If F = 0, reset the clock and return 0. * *	If F = 1, pass the user time to Msg and print Msg on  *	screen, return the real time since F=0.  * *	If F = 2, same as F=1 except no printing.   * *	Note that clock() and time() return user time and real  *	time respectively. *	User time is whatever the system allocates to the  *	running of the program;  *	real time is wall-clock time.  In a time-shared system, *	they need not be the same. *	 *	clock() only hold 16 bit integer, which is about 32768  *	clock ticks. ****/time_t PunchTime(char F, char *Msg){#if GNUCC  return(0);#else  static clock_t ut0;	/* user time reference. */  static time_t  rt0;	/* real time reference. */  double secs;  char s[STRLEN];    if(F==0) {    ut0 = clock();    rt0 = time(NULL);    return(0);  }  else if(F==1)  {    secs = (clock() - ut0)/(double)CLOCKS_PER_SEC;    if (secs<0) secs=0;	/* clock() can overflow. */    sprintf(s, "User time: %8.0lf sec = %8.2lf hr.  %s\n", 	    secs, secs/3600.0, Msg);    puts(s);    strcpy(Msg, s);    return(difftime(time(NULL), rt0));  }  else if(F==2) return(difftime(time(NULL), rt0));  else return(0);#endif}/*********************************************************** *	Print the current time and the estimated finishing time. * *	P1 is the number of computed photon packets. *	Pt is the total number of photon packets. ****/void PredictDoneTime(long P1, long Pt)	{  time_t now, done_time;  struct tm *date;  char s[80];    now = time(NULL);  date = localtime(&now);  strftime(s, 80, "%H:%M %x", date);  printf("Now %s, ", s);    done_time = now + 			(time_t) (PunchTime(2,"")/(double)P1*(Pt-P1));  date = localtime(&done_time);  strftime(s, 80, "%H:%M %x", date);  printf("End %s\n", s);}/*********************************************************** *	Report time and write results.  ****/void ReportResult(InputStruct In_Parm, OutStruct Out_Parm){  char time_report[STRLEN];    strcpy(time_report, " Simulation time of this run.");  PunchTime(1, time_report);  SumScaleResult(In_Parm, &Out_Parm);  WriteResult(In_Parm, Out_Parm, time_report);}/*********************************************************** *	Get the file name of the input data file from the  *	argument to the command line. ****/void GetFnameFromArgv(int argc,					  char * argv[],					  char * input_filename){  if(argc>=2) {			/* filename in command line */    strcpy(input_filename, argv[1]);  }  else    input_filename[0] = '\0';}     /*********************************************************** *	Execute Monte Carlo simulation for one independent run. ****/void DoOneRun(short NumRuns, InputStruct *In_Ptr){  register long i_photon;		/* index to photon. register for speed.*/  OutStruct out_parm;		/* distribution of photons.*/  PhotonStruct photon;  long num_photons = In_Ptr->num_photons, photon_rep=10;#if THINKCPROFILER  InitProfile(200,200); cecho2file("prof.rpt",0, stdout);#endif      InitOutputData(*In_Ptr, &out_parm);  out_parm.Rsp = Rspecular(In_Ptr->layerspecs);	  i_photon = num_photons;  PunchTime(0, "");      do {    if(num_photons - i_photon == photon_rep) {      printf("%ld photons & %hd runs left, ", i_photon, NumRuns);      PredictDoneTime(num_photons - i_photon, num_photons);      photon_rep *= 10;    }    LaunchPhoton(out_parm.Rsp, In_Ptr->layerspecs, &photon);    do  HopDropSpin(In_Ptr, &photon, &out_parm);    while (!photon.dead);  } while(--i_photon);    #if THINKCPROFILER  exit(0);#endif      ReportResult(*In_Ptr, out_parm);  FreeData(*In_Ptr, &out_parm);}/*********************************************************** *	The argument to the command line is filename, if any. *	Macintosh does not support command line. ****/intmain(int argc, char *argv[]) {  char input_filename[STRLEN];  FILE *input_file_ptr;  short num_runs;	/* number of independent runs. */  InputStruct in_parm;  ShowVersion("Version 1.2.2, 2000");  GetFnameFromArgv(argc, argv, input_filename);  input_file_ptr = GetFile(input_filename);  CheckParm(input_file_ptr, &in_parm);	  num_runs = ReadNumRuns(input_file_ptr);    while(num_runs--)  {    ReadParm(input_file_ptr, &in_parm);	DoOneRun(num_runs, &in_parm);  }    fclose(input_file_ptr);  return(0);}

⌨️ 快捷键说明

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