Lemma is an Electromagnetics API
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

modelreadertem1dubc.cpp 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. /* This file is part of Lemma, a geophysical modelling and inversion API */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. /**
  6. @file
  7. @author M. Andy Kass
  8. @date 02/19/2011
  9. @version $Id: modelreadertem1dubc.cpp 153 2014-03-21 23:54:38Z tirons $
  10. **/
  11. #include "modelreadertem1dubc.h"
  12. namespace Lemma {
  13. std::ostream &operator<<(std::ostream &stream,
  14. const ModelReaderTem1DUBC &ob) {
  15. stream << *(ModelReaderTem1DUBC*)(&ob);
  16. return stream;
  17. }
  18. ModelReaderTem1DUBC::ModelReaderTem1DUBC(const std::string &name) :
  19. ModelReaderTem1D(name), Trans(NULL), Receivers(NULL),
  20. EarthMod(NULL) {
  21. }
  22. ModelReaderTem1DUBC::~ModelReaderTem1DUBC() {
  23. if (NumberOfReferences != 0) {
  24. throw DeleteObjectWithReferences(this);
  25. }
  26. }
  27. ModelReaderTem1DUBC* ModelReaderTem1DUBC::New() {
  28. ModelReaderTem1DUBC* Obj = new
  29. ModelReaderTem1DUBC("ModelReaderTem1DUBC");
  30. Obj->AttachTo(Obj);
  31. return Obj;
  32. }
  33. void ModelReaderTem1DUBC::Delete() {
  34. this->DetachFrom(this);
  35. }
  36. void ModelReaderTem1DUBC::Release() {
  37. delete this;
  38. }
  39. void ModelReaderTem1DUBC::SetEMEarth1D(LayeredEarthEM* earth) {
  40. if (this->EarthMod != NULL) {
  41. this->EarthMod->DetachFrom(this);
  42. }
  43. earth->AttachTo(this);
  44. this->EarthMod=earth;
  45. }
  46. void ModelReaderTem1DUBC::SetTransmitter(WireAntenna* antennae) {
  47. if (this->Trans != NULL) {
  48. this->Trans->DetachFrom(this);
  49. }
  50. antennae->AttachTo(this);
  51. this->Trans=antennae;
  52. }
  53. void ModelReaderTem1DUBC::SetReceiver(ReceiverPoints* receiver) {
  54. if (this->Receivers != NULL) {
  55. this->Receivers->DetachFrom(this);
  56. }
  57. receiver->AttachTo(this);
  58. this->Receivers=receiver;
  59. }
  60. void ModelReaderTem1DUBC::ReadParameters(const std::string &params) {
  61. std::string temp;
  62. std::string temp2;
  63. char* commentBuffer = new char[200];
  64. int bufsize;
  65. bufsize = 200;
  66. std::fstream infile(params.c_str(),std::ios::in);
  67. if (infile.fail()) {
  68. std::cout << "Parameter file I/O error." << std::endl;
  69. }
  70. infile.getline(commentBuffer,bufsize);
  71. temp = commentBuffer;
  72. std::istringstream in(temp);
  73. in >> this->instrumentfile;
  74. in.clear();
  75. //testing only
  76. //std::cout << this->instrumentfile << std::endl;
  77. infile.getline(commentBuffer,bufsize);
  78. temp = " ";
  79. temp = commentBuffer;
  80. std::istringstream in2(temp);
  81. in2 >> this->modelfile;
  82. in2.clear();
  83. //testing only
  84. //std::cout << this->modelfile << std::endl;
  85. infile.getline(commentBuffer,bufsize);
  86. infile.getline(commentBuffer,bufsize);
  87. infile.getline(commentBuffer,bufsize);
  88. temp = " ";
  89. temp = commentBuffer;
  90. std::istringstream in3(temp);
  91. in3 >> temp2;
  92. if (temp2 == "y" || temp2 == "Y" || temp2 == "yes" || temp2 == "Yes" ||
  93. temp2 == "YES" || temp2 == "true" || temp2 == "True" ||
  94. temp2 == "TRUE") {
  95. this->addednoise = true;
  96. }
  97. else {
  98. this->addednoise = false;
  99. }
  100. in3.clear();
  101. //testing only
  102. //std::cout << this->addednoise << std::endl;
  103. if (this->addednoise == true) {
  104. infile.getline(commentBuffer,bufsize);
  105. temp = " ";
  106. temp = commentBuffer;
  107. std::istringstream in4(temp);
  108. in4 >> this->noisepercent;
  109. in4 >> this->noisethresh;
  110. in4 >> this->noiseseed;
  111. in4.clear();
  112. //std::cout << this->noisepercent << " " << this->noisethresh <<
  113. // " " << this->noiseseed << std::endl;
  114. }
  115. infile.close();
  116. delete [] commentBuffer;
  117. // Call the other readers from here.
  118. this->ReadModel();
  119. this->ReadInstrument();
  120. }
  121. void ModelReaderTem1DUBC::ReadModel() {
  122. // Model File cannot have comments!
  123. int numlayers; //includes both halfspace and air layers
  124. VectorXr thicknesses;
  125. VectorXr conductivities;
  126. VectorXcr complexconduct;
  127. std::string temp;
  128. Real temp2;
  129. std::fstream infile(this->modelfile.c_str(),std::ios::in);
  130. if (infile.fail()) {
  131. std::cout << "Model File I/O error." << std::endl;
  132. }
  133. infile >> numlayers;
  134. numlayers = numlayers + 1;
  135. thicknesses.resize(numlayers-2);
  136. conductivities.resize(numlayers);
  137. conductivities(0) = 0.;
  138. //Testing
  139. //std::cout << "Numlayers " << numlayers << std::endl;
  140. //std::cout << conductivities(0) << std::endl;
  141. for (int ii=0;ii<numlayers-2;ii++) {
  142. infile >> thicknesses(ii);
  143. infile >> conductivities(ii+1);
  144. //Testing
  145. //std::cout<<ii<<" "<<thicknesses(ii)<<" "<<conductivities(ii+1)
  146. // << std::endl;
  147. }
  148. infile >> temp2;
  149. //Testing
  150. //std::cout << temp2 << std::endl;
  151. infile >> conductivities(numlayers-1);
  152. //Testing
  153. //std::cout << conductivities(numlayers-1) << std::endl;
  154. //std::cout << "Thicknesses: " << thicknesses << std::endl;
  155. //std::cout << "Conductivities: " << conductivities << std::endl;
  156. //Didn't read the function declaration. Conductivities needs
  157. //to be complex...
  158. complexconduct.resize(conductivities.size());
  159. complexconduct.setZero();
  160. complexconduct.real() = conductivities.array();
  161. //Testing
  162. //std::cout << complexconduct << std::endl;
  163. // Attach all to layered earth class
  164. this->EarthMod->SetNumberOfLayers(numlayers);
  165. this->EarthMod->SetLayerConductivity(complexconduct);
  166. this->EarthMod->SetLayerThickness(thicknesses);
  167. infile.close();
  168. }
  169. void ModelReaderTem1DUBC::ReadInstrument() {
  170. // No comments allowed in this data file either for now.
  171. int tempint;
  172. Real tempreal;
  173. VectorXr transpoints;
  174. MatrixXr receiverpoints;
  175. std::string tempstring;
  176. VectorXr tempvec;
  177. int timeunits;
  178. int ntimes;
  179. int ntimestemp;
  180. int numsounds;
  181. VectorXr orientation;
  182. MatrixXr timestemp;
  183. //Testing
  184. //std::cout << "ModelReaderTem1DUBC::ReadInstrument()" << std::endl;
  185. std::fstream infile(this->instrumentfile.c_str(),std::ios::in);
  186. if (infile.fail()) {
  187. std::cout << "Observations File I/O error." << std::endl;
  188. }
  189. infile >> tempint;
  190. this->Trans->SetNumberOfPoints(tempint+1);
  191. //Testing
  192. //std::cout << "Number of Points: " << tempint << std::endl;
  193. transpoints.resize(tempint*2+2);
  194. //Testing
  195. //std::cout << "Transmitter corners: ";
  196. for (int ii=0;ii<(tempint*2);ii++) {
  197. infile >> transpoints(ii);
  198. //Testing
  199. //std::cout << transpoints(ii) << " ";
  200. }
  201. transpoints(tempint*2) = transpoints(0);
  202. transpoints(tempint*2+1) = transpoints(1);
  203. //Testing
  204. //std::cout << transpoints(tempint*2) << " " <<
  205. // transpoints(tempint*2+1) << std::endl;
  206. infile >> tempreal;
  207. //Testing
  208. //std::cout << "Transmitter height: " << tempreal << std::endl;
  209. int jj;
  210. jj = 0;
  211. for (int ii=0;ii<(tempint+1);ii++) {
  212. this->Trans->SetPoint(ii,Vector3r(transpoints(jj),
  213. transpoints(jj+1),tempreal));
  214. //Testing
  215. //std::cout<< transpoints(jj) << transpoints(jj+1) << std::endl;
  216. jj = jj+2;
  217. }
  218. //Testing
  219. infile >> this->waveformfile;
  220. //Testing
  221. //std::cout << "Waveform file: " << this->waveformfile << std::endl;
  222. infile >> numsounds; // number of soundings
  223. //Testing
  224. //std::cout << "Number of soundings: " << numsounds << std::endl;
  225. this->Trans->SetCurrent(1);
  226. this->Trans->SetNumberOfTurns(1);
  227. infile >> timeunits; // flag for units of time
  228. // 1 = microseconds, 2 = milliseconds, 3 = seconds
  229. //Testing
  230. //std::cout << "Time units: " << timeunits << std::endl;
  231. receiverpoints.resize(numsounds,3);
  232. //Testing
  233. //std::cout << "Receiverpoints resized" << std::endl;
  234. this->receivermoment.resize(numsounds);
  235. //Testing
  236. //std::cout << "Receivermoment resized" << std::endl;
  237. orientation.resize(numsounds);
  238. //Testing
  239. //std::cout << "Orientation resized" << std::endl;
  240. ntimestemp = 30;
  241. timestemp.resize(numsounds,ntimestemp);
  242. //Testing
  243. //std::cout << "timestemp resized" << std::endl;
  244. this->Receivers->SetNumberOfReceivers(numsounds);
  245. //Testing
  246. //std::cout << "Reading receiver points" << std::endl;
  247. for (int ii=0;ii<numsounds;ii++) {
  248. //Testing
  249. //std::cout << "Beginning iteration: " << ii << std::endl;
  250. infile >> this->receivermoment(ii); //receiver moment
  251. //Testing
  252. //std::cout << "Receiver moment: " << this->receivermoment(ii)
  253. // << std::endl;
  254. infile >> receiverpoints(ii,0);
  255. infile >> receiverpoints(ii,1);
  256. infile >> receiverpoints(ii,2);
  257. //Testing
  258. //std::cout << "Receiverpoints: " << receiverpoints.row(ii)
  259. // << std::endl;
  260. this->Receivers->SetLocation(ii,receiverpoints.row(ii));
  261. infile >> tempstring; //receiver orientation
  262. //Testing
  263. //std::cout << "Receiver orientation: " << tempstring << std::endl;
  264. if (tempstring == "z") {
  265. orientation(ii) = 0;
  266. }
  267. if (tempstring == "x") {
  268. orientation(ii) = 1;
  269. }
  270. if (tempstring == "y") {
  271. orientation(ii) = 2;
  272. }
  273. else {
  274. orientation(ii) = 0;
  275. }
  276. //Testing
  277. //std::cout << "Modified orientation: " << orientation(ii)
  278. // << std::endl;
  279. infile >> ntimes;
  280. //Testing
  281. //std::cout << "Number of gates: " << ntimes << std::endl;
  282. if (ntimes != ntimestemp) {
  283. timestemp.resize(Eigen::NoChange,ntimes);
  284. ntimestemp = ntimes;
  285. //Testing
  286. // std::cout << "Better not be here!" << std::endl;
  287. }
  288. //Testing
  289. //std::cout << "Actual size: " << timestemp.size() << std::endl;
  290. infile >> tempint;
  291. //Testing
  292. //std::cout << "Unknown variable: " << tempint << std::endl;
  293. //std::cout << "Times: ";
  294. for (int jj=0;jj<ntimes;jj++) {
  295. infile >> timestemp(ii,jj);
  296. //Testing
  297. std::cout << "time read? " << jj << ". " << timestemp(ii,jj) << "\t " << tempint << std::endl;
  298. infile >> tempint;
  299. }
  300. //Testing
  301. //std::cout << std::endl;
  302. }
  303. infile.close();
  304. //Testing
  305. //std::cout << "Left the loop" << std::endl;
  306. // Make sure times are in seconds
  307. if (timeunits == 1) {
  308. timestemp = timestemp.array()/1e6;
  309. timeunits = 3;
  310. }
  311. if (timeunits == 2) {
  312. timestemp = timestemp.array()/1e3;
  313. timeunits = 3;
  314. }
  315. //Testing
  316. //std::cout << "Scaled times: " << timestemp << std::endl;
  317. this->modtimes.resize(ntimes);
  318. //Testing
  319. //std::cout << "Modtimes size: " << this->modtimes.size() << std::endl;
  320. //std::cout << "timestemp size: " << timestemp.rows() << " x " <<
  321. // timestemp.cols() << std::endl;
  322. tempvec = timestemp.row(0);
  323. this->modtimes = tempvec.array();
  324. //Testing
  325. //std::cout << "Finished with loading modtimes" << std::endl;
  326. // This code has been written so far to allow for the general case
  327. // of soundings with different vectors of times. However, the
  328. // instrument class has not been defined that way yet. So right now
  329. // only one vector of times is returned via an accessor. This will
  330. // be changed later.
  331. }
  332. void ModelReaderTem1DUBC::ReadWaveform() {
  333. }
  334. VectorXr ModelReaderTem1DUBC::GetTimes() {
  335. //Testing
  336. //std::cout << this->modtimes;
  337. return this->modtimes;
  338. }
  339. //Datamembers:
  340. // modelfile, instrumentfile, waveformfile
  341. } // namespace Lemma