PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/mesch/zmatio.c

https://bitbucket.org/nrnhines/nrn
C | 401 lines | 302 code | 53 blank | 46 comment | 130 complexity | aef82240c9d73f4c865a7b44f55cee36 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. #include <../../nrnconf.h>
  2. /**************************************************************************
  3. **
  4. ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
  5. **
  6. ** Meschach Library
  7. **
  8. ** This Meschach Library is provided "as is" without any express
  9. ** or implied warranty of any kind with respect to this software.
  10. ** In particular the authors shall not be liable for any direct,
  11. ** indirect, special, incidental or consequential damages arising
  12. ** in any way from use of the software.
  13. **
  14. ** Everyone is granted permission to copy, modify and redistribute this
  15. ** Meschach Library, provided:
  16. ** 1. All copies contain this copyright notice.
  17. ** 2. All modified copies shall carry a notice stating who
  18. ** made the last modification and the date of such modification.
  19. ** 3. No charge is made for this software or works derived from it.
  20. ** This clause shall not be construed as constraining other software
  21. ** distributed on the same medium as this software, nor is a
  22. ** distribution fee considered a charge.
  23. **
  24. ***************************************************************************/
  25. #include <stdio.h>
  26. #include <ctype.h>
  27. #include "zmatrix.h"
  28. static char rcsid[] = "zmatio.c,v 1.1 1997/12/04 17:56:11 hines Exp";
  29. /* local variables */
  30. static char line[MAXLINE];
  31. /**************************************************************************
  32. Input routines
  33. **************************************************************************/
  34. complex z_finput(fp)
  35. FILE *fp;
  36. {
  37. int io_code;
  38. complex z;
  39. skipjunk(fp);
  40. if ( isatty(fileno(fp)) )
  41. {
  42. do {
  43. fprintf(stderr,"real and imag parts: ");
  44. if ( fgets(line,MAXLINE,fp) == NULL )
  45. error(E_EOF,"z_finput");
  46. #if REAL == DOUBLE
  47. io_code = sscanf(line,"%lf%lf",&z.re,&z.im);
  48. #elif REAL == FLOAT
  49. io_code = sscanf(line,"%f%f",&z.re,&z.im);
  50. #endif
  51. } while ( io_code != 2 );
  52. }
  53. else
  54. #if REAL == DOUBLE
  55. if ( (io_code=fscanf(fp," (%lf,%lf)",&z.re,&z.im)) < 2 )
  56. #elif REAL == FLOAT
  57. if ( (io_code=fscanf(fp," (%f,%f)",&z.re,&z.im)) < 2 )
  58. #endif
  59. error((io_code == EOF) ? E_EOF : E_FORMAT,"z_finput");
  60. return z;
  61. }
  62. ZMAT *zm_finput(fp,a)
  63. FILE *fp;
  64. ZMAT *a;
  65. {
  66. ZMAT *izm_finput(),*bzm_finput();
  67. if ( isatty(fileno(fp)) )
  68. return izm_finput(fp,a);
  69. else
  70. return bzm_finput(fp,a);
  71. }
  72. /* izm_finput -- interactive input of matrix */
  73. ZMAT *izm_finput(fp,mat)
  74. FILE *fp;
  75. ZMAT *mat;
  76. {
  77. char c;
  78. u_int i, j, m, n, dynamic;
  79. /* dynamic set to TRUE if memory allocated here */
  80. /* get matrix size */
  81. if ( mat != ZMNULL && mat->m<MAXDIM && mat->n<MAXDIM )
  82. { m = mat->m; n = mat->n; dynamic = FALSE; }
  83. else
  84. {
  85. dynamic = TRUE;
  86. do
  87. {
  88. fprintf(stderr,"ComplexMatrix: rows cols:");
  89. if ( fgets(line,MAXLINE,fp)==NULL )
  90. error(E_INPUT,"izm_finput");
  91. } while ( sscanf(line,"%u%u",&m,&n)<2 || m>MAXDIM || n>MAXDIM );
  92. mat = zm_get(m,n);
  93. }
  94. /* input elements */
  95. for ( i=0; i<m; i++ )
  96. {
  97. redo:
  98. fprintf(stderr,"row %u:\n",i);
  99. for ( j=0; j<n; j++ )
  100. do
  101. {
  102. redo2:
  103. fprintf(stderr,"entry (%u,%u): ",i,j);
  104. if ( !dynamic )
  105. fprintf(stderr,"old (%14.9g,%14.9g) new: ",
  106. mat->me[i][j].re,mat->me[i][j].im);
  107. if ( fgets(line,MAXLINE,fp)==NULL )
  108. error(E_INPUT,"izm_finput");
  109. if ( (*line == 'b' || *line == 'B') && j > 0 )
  110. { j--; dynamic = FALSE; goto redo2; }
  111. if ( (*line == 'f' || *line == 'F') && j < n-1 )
  112. { j++; dynamic = FALSE; goto redo2; }
  113. } while ( *line=='\0' ||
  114. #if REAL == DOUBLE
  115. sscanf(line,"%lf%lf",
  116. #elif REAL == FLOAT
  117. sscanf(line,"%f%f",
  118. #endif
  119. &mat->me[i][j].re,&mat->me[i][j].im)<1 );
  120. fprintf(stderr,"Continue: ");
  121. if (fscanf(fp,"%c",&c) != 1) { error(E_INPUT, "izm_finput"); }
  122. if ( c == 'n' || c == 'N' )
  123. { dynamic = FALSE; goto redo; }
  124. if ( (c == 'b' || c == 'B') /* && i > 0 */ )
  125. { if ( i > 0 )
  126. i--;
  127. dynamic = FALSE; goto redo;
  128. }
  129. }
  130. return (mat);
  131. }
  132. /* bzm_finput -- batch-file input of matrix */
  133. ZMAT *bzm_finput(fp,mat)
  134. FILE *fp;
  135. ZMAT *mat;
  136. {
  137. u_int i,j,m,n,dummy;
  138. int io_code;
  139. /* get dimension */
  140. skipjunk(fp);
  141. if ((io_code=fscanf(fp," ComplexMatrix: %u by %u",&m,&n)) < 2 ||
  142. m>MAXDIM || n>MAXDIM )
  143. error(io_code==EOF ? E_EOF : E_FORMAT,"bzm_finput");
  144. /* allocate memory if necessary */
  145. if ( mat==ZMNULL || mat->m<m || mat->n<n )
  146. mat = zm_resize(mat,m,n);
  147. /* get entries */
  148. for ( i=0; i<m; i++ )
  149. {
  150. skipjunk(fp);
  151. if ( fscanf(fp," row %u:",&dummy) < 1 )
  152. error(E_FORMAT,"bzm_finput");
  153. for ( j=0; j<n; j++ )
  154. {
  155. /* printf("bzm_finput: j = %d\n", j); */
  156. #if REAL == DOUBLE
  157. if ((io_code=fscanf(fp," ( %lf , %lf )",
  158. #elif REAL == FLOAT
  159. if ((io_code=fscanf(fp," ( %f , %f )",
  160. #endif
  161. &mat->me[i][j].re,&mat->me[i][j].im)) < 2 )
  162. error(io_code==EOF ? E_EOF : E_FORMAT,"bzm_finput");
  163. }
  164. }
  165. return (mat);
  166. }
  167. ZVEC *zv_finput(fp,x)
  168. FILE *fp;
  169. ZVEC *x;
  170. {
  171. ZVEC *izv_finput(),*bzv_finput();
  172. if ( isatty(fileno(fp)) )
  173. return izv_finput(fp,x);
  174. else
  175. return bzv_finput(fp,x);
  176. }
  177. /* izv_finput -- interactive input of vector */
  178. ZVEC *izv_finput(fp,vec)
  179. FILE *fp;
  180. ZVEC *vec;
  181. {
  182. u_int i,dim,dynamic; /* dynamic set if memory allocated here */
  183. /* get vector dimension */
  184. if ( vec != ZVNULL && vec->dim<MAXDIM )
  185. { dim = vec->dim; dynamic = FALSE; }
  186. else
  187. {
  188. dynamic = TRUE;
  189. do
  190. {
  191. fprintf(stderr,"ComplexVector: dim: ");
  192. if ( fgets(line,MAXLINE,fp)==NULL )
  193. error(E_INPUT,"izv_finput");
  194. } while ( sscanf(line,"%u",&dim)<1 || dim>MAXDIM );
  195. vec = zv_get(dim);
  196. }
  197. /* input elements */
  198. for ( i=0; i<dim; i++ )
  199. do
  200. {
  201. redo:
  202. fprintf(stderr,"entry %u: ",i);
  203. if ( !dynamic )
  204. fprintf(stderr,"old (%14.9g,%14.9g) new: ",
  205. vec->ve[i].re,vec->ve[i].im);
  206. if ( fgets(line,MAXLINE,fp)==NULL )
  207. error(E_INPUT,"izv_finput");
  208. if ( (*line == 'b' || *line == 'B') && i > 0 )
  209. { i--; dynamic = FALSE; goto redo; }
  210. if ( (*line == 'f' || *line == 'F') && i < dim-1 )
  211. { i++; dynamic = FALSE; goto redo; }
  212. } while ( *line=='\0' ||
  213. #if REAL == DOUBLE
  214. sscanf(line,"%lf%lf",
  215. #elif REAL == FLOAT
  216. sscanf(line,"%f%f",
  217. #endif
  218. &vec->ve[i].re,&vec->ve[i].im) < 2 );
  219. return (vec);
  220. }
  221. /* bzv_finput -- batch-file input of vector */
  222. ZVEC *bzv_finput(fp,vec)
  223. FILE *fp;
  224. ZVEC *vec;
  225. {
  226. u_int i,dim;
  227. int io_code;
  228. /* get dimension */
  229. skipjunk(fp);
  230. if ((io_code=fscanf(fp," ComplexVector: dim:%u",&dim)) < 1 ||
  231. dim>MAXDIM )
  232. error(io_code==EOF ? 7 : 6,"bzv_finput");
  233. /* allocate memory if necessary */
  234. if ( vec==ZVNULL || vec->dim<dim )
  235. vec = zv_resize(vec,dim);
  236. /* get entries */
  237. skipjunk(fp);
  238. for ( i=0; i<dim; i++ )
  239. #if REAL == DOUBLE
  240. if ((io_code=fscanf(fp," (%lf,%lf)",
  241. #elif REAL == FLOAT
  242. if ((io_code=fscanf(fp," (%f,%f)",
  243. #endif
  244. &vec->ve[i].re,&vec->ve[i].im)) < 2 )
  245. error(io_code==EOF ? 7 : 6,"bzv_finput");
  246. return (vec);
  247. }
  248. /**************************************************************************
  249. Output routines
  250. **************************************************************************/
  251. static char *zformat = " (%14.9g, %14.9g) ";
  252. char *setzformat(f_string)
  253. char *f_string;
  254. {
  255. char *old_f_string;
  256. old_f_string = zformat;
  257. if ( f_string != (char *)NULL && *f_string != '\0' )
  258. zformat = f_string;
  259. return old_f_string;
  260. }
  261. void z_foutput(fp,z)
  262. FILE *fp;
  263. complex z;
  264. {
  265. fprintf(fp,zformat,z.re,z.im);
  266. putc('\n',fp);
  267. }
  268. void zm_foutput(fp,a)
  269. FILE *fp;
  270. ZMAT *a;
  271. {
  272. u_int i, j, tmp;
  273. if ( a == ZMNULL )
  274. { fprintf(fp,"ComplexMatrix: NULL\n"); return; }
  275. fprintf(fp,"ComplexMatrix: %d by %d\n",a->m,a->n);
  276. if ( a->me == (complex **)NULL )
  277. { fprintf(fp,"NULL\n"); return; }
  278. for ( i=0; i<a->m; i++ ) /* for each row... */
  279. {
  280. fprintf(fp,"row %u: ",i);
  281. for ( j=0, tmp=1; j<a->n; j++, tmp++ )
  282. { /* for each col in row... */
  283. fprintf(fp,zformat,a->me[i][j].re,a->me[i][j].im);
  284. if ( ! (tmp % 2) ) putc('\n',fp);
  285. }
  286. if ( tmp % 2 != 1 ) putc('\n',fp);
  287. }
  288. }
  289. void zv_foutput(fp,x)
  290. FILE *fp;
  291. ZVEC *x;
  292. {
  293. u_int i, tmp;
  294. if ( x == ZVNULL )
  295. { fprintf(fp,"ComplexVector: NULL\n"); return; }
  296. fprintf(fp,"ComplexVector: dim: %d\n",x->dim);
  297. if ( x->ve == (complex *)NULL )
  298. { fprintf(fp,"NULL\n"); return; }
  299. for ( i=0, tmp=0; i<x->dim; i++, tmp++ )
  300. {
  301. fprintf(fp,zformat,x->ve[i].re,x->ve[i].im);
  302. if ( (tmp % 2) == 1 ) putc('\n',fp);
  303. }
  304. if ( (tmp % 2) != 0 ) putc('\n',fp);
  305. }
  306. void zm_dump(fp,a)
  307. FILE *fp;
  308. ZMAT *a;
  309. {
  310. u_int i, j, tmp;
  311. if ( a == ZMNULL )
  312. { fprintf(fp,"ComplexMatrix: NULL\n"); return; }
  313. fprintf(fp,"ComplexMatrix: %d by %d @ 0x%p\n",a->m,a->n,a);
  314. fprintf(fp,"\tmax_m = %d, max_n = %d, max_size = %d\n",
  315. a->max_m, a->max_n, a->max_size);
  316. if ( a->me == (complex **)NULL )
  317. { fprintf(fp,"NULL\n"); return; }
  318. fprintf(fp,"a->me @ 0x%p\n",(a->me));
  319. fprintf(fp,"a->base @ 0x%p\n",(a->base));
  320. for ( i=0; i<a->m; i++ ) /* for each row... */
  321. {
  322. fprintf(fp,"row %u: @ 0x%p ",i,(a->me[i]));
  323. for ( j=0, tmp=1; j<a->n; j++, tmp++ )
  324. { /* for each col in row... */
  325. fprintf(fp,zformat,a->me[i][j].re,a->me[i][j].im);
  326. if ( ! (tmp % 2) ) putc('\n',fp);
  327. }
  328. if ( tmp % 2 != 1 ) putc('\n',fp);
  329. }
  330. }
  331. void zv_dump(fp,x)
  332. FILE *fp;
  333. ZVEC *x;
  334. {
  335. u_int i, tmp;
  336. if ( ! x )
  337. { fprintf(fp,"ComplexVector: NULL\n"); return; }
  338. fprintf(fp,"ComplexVector: dim: %d @ 0x%p\n",x->dim,(x));
  339. if ( ! x->ve )
  340. { fprintf(fp,"NULL\n"); return; }
  341. fprintf(fp,"x->ve @ 0x%p\n",(x->ve));
  342. for ( i=0, tmp=0; i<x->dim; i++, tmp++ )
  343. {
  344. fprintf(fp,zformat,x->ve[i].re,x->ve[i].im);
  345. if ( tmp % 2 == 1 ) putc('\n',fp);
  346. }
  347. if ( tmp % 2 != 0 ) putc('\n',fp);
  348. }