int main(int argc, char *argv[]) { if (argc > 1) { if (sscanf(argv[1], "%lg", &diameter) != 1) { printf("Got bad argument: %s\n", argv[1]); return 1; } diameter *= nm; using_default_diameter = false; printf("Diameter is %g bohr\n", diameter); } const double ptransition =(3.0*M_PI-4.0)*(diameter/2.0)/2.0; const double dmax = ptransition + 0.6*nm; double zmax = 2*diameter+dmax+2*nm; double ymax = 2*diameter+dmax+2*nm; char *datname = new char[1024]; snprintf(datname, 1024, "papers/water-saft/figs/four-rods-in-water-%04.1fnm.dat", diameter/nm); FILE *o = fopen(datname, "w"); delete[] datname; Functional f = OfEffectivePotential(WaterSaft(new_water_prop.lengthscale, new_water_prop.epsilonAB, new_water_prop.kappaAB, new_water_prop.epsilon_dispersion, new_water_prop.lambda_dispersion, new_water_prop.length_scaling, 0)); double n_1atm = pressure_to_density(f, new_water_prop.kT, atmospheric_pressure, 0.001, 0.01); double mu_satp = find_chemical_potential(f, new_water_prop.kT, n_1atm); f = OfEffectivePotential(WaterSaft(new_water_prop.lengthscale, new_water_prop.epsilonAB, new_water_prop.kappaAB, new_water_prop.epsilon_dispersion, new_water_prop.lambda_dispersion, new_water_prop.length_scaling, mu_satp)); const double EperVolume = f(new_water_prop.kT, -new_water_prop.kT*log(n_1atm)); const double EperCell = EperVolume*(zmax*ymax - 4*0.25*M_PI*diameter*diameter)*width; //Functional X = Xassociation(new_water_prop.lengthscale, new_water_prop.epsilonAB, // new_water_prop.kappaAB, new_water_prop.epsilon_dispersion, // new_water_prop.lambda_dispersion, // new_water_prop.length_scaling); Functional S = OfEffectivePotential(EntropySaftFluid2(new_water_prop.lengthscale, new_water_prop.epsilonAB, new_water_prop.kappaAB, new_water_prop.epsilon_dispersion, new_water_prop.lambda_dispersion, new_water_prop.length_scaling)); //dmax, dstep already in bohrs (so it doesn't need to be converted from nm) double dstep = 0.25*nm; for (distance=0.0*nm; distance<=dmax; distance += dstep) { if ((distance >= ptransition - 0.5*nm) && (distance <= ptransition + 0.05*nm)) { if (distance >= ptransition - 0.25*nm) { dstep = 0.03*nm; } else { dstep = 0.08*nm; } } else { dstep = 0.25*nm; } Lattice lat(Cartesian(width,0,0), Cartesian(0,ymax,0), Cartesian(0,0,zmax)); GridDescription gd(lat, 0.2); printf("Grid is %d x %d x %d\n", gd.Nx, gd.Ny, gd.Nz); Grid potential(gd); Grid constraint(gd); constraint.Set(notinwall); f = OfEffectivePotential(WaterSaft(new_water_prop.lengthscale, new_water_prop.epsilonAB, new_water_prop.kappaAB, new_water_prop.epsilon_dispersion, new_water_prop.lambda_dispersion, new_water_prop.length_scaling, mu_satp)); f = constrain(constraint, f); printf("Diameter is %g bohr (%g nm)\n", diameter, diameter/nm); printf("Distance between rods = %g bohr (%g nm)\n", distance, distance/nm); potential = new_water_prop.liquid_density*constraint + 400*new_water_prop.vapor_density*VectorXd::Ones(gd.NxNyNz); //potential = new_water_prop.liquid_density*VectorXd::Ones(gd.NxNyNz); potential = -new_water_prop.kT*potential.cwise().log(); const double surface_tension = 5e-5; // crude guess from memory... const double surfprecision = 1e-5*(4*M_PI*diameter)*width*surface_tension; // five digits accuracy const double bulkprecision = 1e-12*fabs(EperCell); // but there's a limit on our precision for small rods const double precision = bulkprecision + surfprecision; printf("Precision limit from surface tension is to %g based on %g and %g\n", precision, surfprecision, bulkprecision); Minimizer min = Precision(precision, PreconditionedConjugateGradient(f, gd, new_water_prop.kT, &potential, QuadraticLineMinimizer)); const int numiters = 200; for (int i=0;i<numiters && min.improve_energy(false);i++) { fflush(stdout); // { // double peak = peak_memory()/1024.0/1024; // double current = current_memory()/1024.0/1024; // printf("Peak memory use is %g M (current is %g M)\n", peak, current); // } } Grid potential2(gd); Grid constraint2(gd); constraint2.Set(notinmiddle); potential2 = new_water_prop.liquid_density*(constraint2.cwise()*constraint) + 400*new_water_prop.vapor_density*VectorXd::Ones(gd.NxNyNz); potential2 = -new_water_prop.kT*potential2.cwise().log(); Minimizer min2 = Precision(1e-12, PreconditionedConjugateGradient(f, gd, new_water_prop.kT, &potential2, QuadraticLineMinimizer)); for (int i=0;i<numiters && min2.improve_energy(false);i++) { fflush(stdout); // { // double peak = peak_memory()/1024.0/1024; // double current = current_memory()/1024.0/1024; // printf("Peak memory use is %g M (current is %g M)\n", peak, current); // } } char *plotnameslice = new char[1024]; snprintf(plotnameslice, 1024, "papers/water-saft/figs/four-rods-%04.1f-%04.2f.dat", diameter/nm, distance/nm); printf("The bulk energy per cell should be %g\n", EperCell); double energy; if (min.energy() < min2.energy()) { energy = (min.energy() - EperCell)/width; Grid density(gd, EffectivePotentialToDensity()(new_water_prop.kT, gd, potential)); printf("Using liquid in middle initially.\n"); plot_grids_yz_directions(plotnameslice, density); { double peak = peak_memory()/1024.0/1024; double current = current_memory()/1024.0/1024; printf("Peak memory use is %g M (current is %g M)\n", peak, current); } } else { energy = (min2.energy() - EperCell)/width; Grid density(gd, EffectivePotentialToDensity()(new_water_prop.kT, gd, potential2)); printf("Using vapor in middle initially.\n"); plot_grids_yz_directions(plotnameslice, density); { double peak = peak_memory()/1024.0/1024; double current = current_memory()/1024.0/1024; printf("Peak memory use is %g M (current is %g M)\n", peak, current); } } printf("Liquid energy is %.15g. Vapor energy is %.15g\n", min.energy(), min2.energy()); fprintf(o, "%g\t%.15g\n", distance/nm, energy); //Grid entropy(gd, S(new_water_prop.kT, potential)); //Grid Xassoc(gd, X(new_water_prop.kT, density)); //plot_grids_y_direction(plotnameslice, density, energy_density, entropy, Xassoc); //Grid energy_density(gd, f(new_water_prop.kT, gd, potential)); delete[] plotnameslice; } fclose(o); { double peak = peak_memory()/1024.0/1024; double current = current_memory()/1024.0/1024; printf("Peak memory use is %g M (current is %g M)\n", peak, current); } }
//------------------------------------------------------- main() { int Gbs_x=map_x/Rbs; // Number of grids on y=1 int Gbs_y=map_y/Rbs; // Number of grids on x=1 int Nbs_x1=floor(Gbs_x/2); //Number og BSs on y=1 int Nbs_x2=floor(((map_x-Rbs)/Rbs)/2); //Number og BSs on y=2 int Nbs_y1=floor(Gbs_y/2); //Number og BSs on x=1 int Nbs_y2=floor(((map_y-Rbs)/Rbs)/2); //Number og BSs on x=2 int Tbs=(Nbs_x1*Nbs_y1)+(Nbs_x2*Nbs_y2); //Total BS on map int length=Rbs/space; //real length int Px=map_x/space; //number of points on x-axis int Py=map_y/space; //number of points on y-axis double TN; //Thermal Noise int i,j; ptrD=&D[0][0]; ptrBR=&BR[0]; ptrModulation=&Modulation[0]; ptrSensitivity=&Sensitivity[0]; ptrDP=&DP[0]; ptrSNR=&SNR[0]; ptrBPL=&BPL[0]; ptrLT=<[0]; ptrDS=&DS[0]; ptrPLT=&PathLossType[0][0]; ptrPL=&PL[0][0]; //ptrP=&P[0][0]; //printf("\n%d\n",Nbs_x1);printf("\n%d\n",Nbs_x2);printf("\n%d\n",Nbs_y1);printf("\n%d\n",Nbs_y2);printf("\n%d\n",Tbs); //for(counter=0;counter<_t;counter++) //totalr+=R[counter];//totalr = 4+6+8+5+2 //checkInputs(); fillCoordinatesBSs(Xbs,Ybs,Gbs_x,Gbs_y,Nbs_x1,Nbs_x2,Nbs_y1,Nbs_y2,length); /*for(i=1;i<=Tbs;i++) printf("Xbs[%d],Ybs[%d]=(%d,%d)\n",i,i,Xbs[i],Ybs[i]); printf("\n");*/ fillCoordinatesTPs(Xtp,Ytp,Px,Py,Tbs,Xbs,Ybs); /*for(i=1;i<=Ntp;i++) printf("Xtp[%d],Ytp[%d]=(%d,%d)\n",i,i,Xtp[i],Ytp[i]);*/ fillDistance(Xbs,Ybs,Xtp,Ytp,ptrD,Tbs); printf("\n"); /*for(i=1;i<=Tbs;i++) for(j=1;j<=Ntp;j++) printf("D[%d][%d]=%.2lf\n",i,j,D[i][j]); printf("\n"); */ fillMs(ptrBR); /* for(i=1;i<=Ntp;i++) printf("BR[%d]:%.2lf Mbps\n",i,BR[i]); printf("\n");*/ TN=ThermalNoise(); //printf("%.2lf\n",TN); //printf("\n"); modulation(TN,ptrBR,Modulation,Sensitivity,DP,SNR); //for(i=1;i<=Ntp;i++) // printf("TP[%d] with modulation %d, DP: %.2lf, SNR: %.2lf, S: %.2lf\n",i,Modulation[i],DP[i],SNR[i],Sensitivity[i]); //printf("\n"); LocationType(ptrLT,Xtp,Ytp); bpl(ptrLT,ptrBPL); //for(i=1;i<=Ntp;i++) // printf("TP[%d]'s location type is %d, bpl is %d\n",i,LT[i],BPL[i]); DataSubcarriers(ptrDS,ptrBR,ptrDP); //printf("\n"); //for(i=1;i<=Ntp;i++) // printf("data subcarriers for TP[%d]:%d\n",i,DS[i]); // printf("\n"); PathLoss(ptrD,ptrPLT,ptrLT,Tbs,ptrPL); power(Tbs,TN); FixedCellSize(Tbs,DS,ptrD,P[0],ptrBR,Xbs,Ybs,Xtp,Ytp); FILE *PowerSavingCPLEX; if((PowerSavingCPLEX=fopen("PowerSavingCPLEX","w"))==NULL) printf("\nerror!Fail to open file!"); else printf("\nOpen PowerSavingCPLEX successfully!\n"); fprintf(PowerSavingCPLEX,"This is the input to CPLEX for power saving model.\n"); objective(Tbs,PowerSavingCPLEX); fprintf(PowerSavingCPLEX,"st\n"); printf("st\n"); constraint1(Tbs,ptrDS,PowerSavingCPLEX); constraint2(Tbs,PowerSavingCPLEX); constraint3(Tbs,PowerSavingCPLEX); constraint4(Tbs,PowerSavingCPLEX); constraint5(Tbs,PowerSavingCPLEX); //constraint5(nr,nt,totalr); constraint6(Tbs,PowerSavingCPLEX); constraint7(Tbs); constraint8(Tbs); constraint9(Tbs); fprintf(PowerSavingCPLEX,"bounds\n"); printf("bounds\n"); bounds(Tbs,PowerSavingCPLEX); specifyTypes(Tbs,PowerSavingCPLEX); fprintf(PowerSavingCPLEX,"end\n"); printf("end\n"); fclose(PowerSavingCPLEX); checkMSsites(Tbs); heuristic(Tbs,P[0],Ntp,MP,DSt,BP,DS,Xbs,Ybs,Xtp,Ytp,ptrD,BR); printf("===================================================================================================================================\n"); Sheuristic(Tbs,P[0],Ntp,MP,DSt,BP,DS,Xbs,Ybs,Xtp,Ytp,ptrD,BR); FILE *outfile, *outfile1; if ((outfile=fopen("outfile1.txt", "w")) == NULL) printf("\n\nerror!Fail to open file!"); else printf("\n\nOpen file successfully!\n"); fprintf(outfile,"BS%dMS%dBP%g\n",Tbs,Ntp,BP); for(i=1;i<=Tbs;i++) for(j=1;j<=Ntp;j++) fprintf(outfile,"%d. BS[%d]=%d,%d MS[%d]=%d,%d DS=%d power=%g mW BW=%g Mbps\n",(i-1)*Ntp+j,i,Xbs[i],Ybs[i],j,Xtp[j],Ytp[j],DS[j],P[i][j],BR[j]); fclose(outfile); if ((outfile1=fopen("coordinates.txt", "w")) == NULL) printf("\n\nerror!Fail to open file!"); else printf("\n\nOpen coordinates.txt successfully!\n"); fprintf(outfile1,"#BS%dMS%dBP%g\n",Tbs,Ntp,BP); for(i=1;i<=Tbs;i++){ for(j=1;j<=Ntp;j++) fprintf(outfile1,"%d. BS[%d] %d %d MS[%d] %d %d DS %d power %g mW BW %g Mbps\n",(i-1)*Ntp+j,i,Xbs[i],Ybs[i],j,Xtp[j],Ytp[j],DS[j],P[i][j],BR[j]); } fprintf(outfile1,"\n\n"); for(i=1;i<=Tbs;i++) fprintf(outfile1," BS[%d]=%d,%d \n",i,Xbs[i],Ybs[i]); fclose(outfile1); //system("pause"); return; }