whet.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include <math.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. /*
  6. timer program -- computes total time in seconds
  7. since the first call. Uses constant CLOCK_RATE
  8. to compute of CPU time in seconds
  9. */
  10. /* Unix clock */
  11. #define CLOCK_RATE 1000000.0
  12. /* MS-DOS Turbo C
  13. #define CLOCK_RATE CLK_TCK
  14. */
  15. float second(void);
  16. float second()
  17. {
  18. return((float)clock() / CLOCK_RATE);
  19. }
  20. /* C-style global parameters */
  21. float T,T1,T2,E1[4];
  22. int J,K,L;
  23. void POUT(long n, long j, long k, float x1, float x2, float x3, float x4)
  24. {
  25. printf("\n %7.1ld%7.1ld%7.1ld%12.4e%12.4e%12.4e%12.4e%8.2f",
  26. n,j,k,x1,x2,x3,x4,second());
  27. }
  28. void PA(E)
  29. float *E;
  30. {
  31. int j;
  32. j=0;
  33. do {
  34. E[0]=(E[0]+E[1]+E[2]-E[3])*T;
  35. E[1]=(E[0]+E[1]-E[2]+E[3])*T;
  36. E[2]=(E[0]-E[1]+E[2]+E[3])*T;
  37. E[3]=(-E[0]+E[1]+E[2]+E[3])/T2;
  38. j=j+1;
  39. }
  40. while(j<6);
  41. }
  42. void P0()
  43. {
  44. E1[J-1]=E1[K-1];
  45. E1[K-1]=E1[L-1];
  46. E1[L-1]=E1[J-1];
  47. }
  48. void P3(X, Y, Z)
  49. float *X, *Y, *Z;
  50. {
  51. float X1, Y1;
  52. X1=*X;
  53. Y1=*Y;
  54. X1=T*(X1+Y1);
  55. Y1=T*(X1+Y1);
  56. *Z=(X1+Y1)/T2;
  57. }
  58. /* equivalent description of FORTRAN-style common block ( slow !) */
  59. /*
  60. struct _comm_blk_ {
  61. float _T, _T1, _T2, _E1[4];
  62. int _J,_K,_L;
  63. } common;
  64. #define T common._T
  65. #define T1 common._T1
  66. #define T2 common._T2
  67. #define E1 common._E1
  68. #define J common._J
  69. #define K common._K
  70. #define L common._L
  71. */
  72. int main()
  73. {
  74. float X1,X2,X3,X4,X,Y,Z;
  75. long I,ISAVE,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12;
  76. printf("Start timing.");
  77. I = 10;
  78. T1=0.50025000;
  79. T=0.499975000;
  80. T2=2.0000;
  81. ISAVE=I;
  82. N1=0;
  83. N2=12*I;
  84. N3=14*I;
  85. N4=348*I;
  86. N5=0;
  87. N6=210*I;
  88. N7=32*I;
  89. N8=899*I;
  90. N9=516*I;
  91. N10=0;
  92. N11=93*I;
  93. N12=0;
  94. X1=1.0;
  95. X2=-1.0;
  96. X3=-1.0;
  97. X4=-1.;
  98. for(I=0; I<N1; I++)
  99. {
  100. X1=(X1+X2+X3-X4)*T;
  101. X2=(X1+X2-X3+X4)*T;
  102. X4=(-X1+X2+X3+X4)*T;
  103. X3=(X1-X2+X3+X4)*T;
  104. }
  105. POUT(N1,N1,N1,X1,X2,X3,X4);
  106. E1[0]=1.0;
  107. E1[1]=-1.0;
  108. E1[2]=-1.0;
  109. E1[3]=-1.0;
  110. for(I=0; I<N2; I++)
  111. {
  112. E1[0]=(E1[0]+E1[1]+E1[2]-E1[3])*T;
  113. E1[1]=(E1[0]+E1[1]-E1[2]+E1[3])*T;
  114. E1[2]=(E1[0]-E1[1]+E1[2]+E1[3])*T;
  115. E1[3]=(-E1[0]+E1[1]+E1[2]+E1[3])*T;
  116. }
  117. POUT(N2,N3,N2,E1[0],E1[1],E1[2],E1[3]);
  118. for(I=0; I<N3; I++) PA(E1);
  119. POUT(N3,N2,N2,E1[0],E1[1],E1[2],E1[3]);
  120. J=1;
  121. for(I=0; I<N4; I++)
  122. {
  123. if(J==1) J=2;
  124. else J=3;
  125. if(J<2) J=0;
  126. else J=1;
  127. if(J<1) J=1;
  128. else J=0;
  129. }
  130. POUT(N4,J,J,X1,X2,X3,X4);
  131. J=1;
  132. K=2;
  133. L=3;
  134. for(I=0; I<N6; I++)
  135. {
  136. J=J*(K-J)*(L-K);
  137. K=L*K-(L-J)*K;
  138. L=(L-K)*(K+J);
  139. E1[L-2]=J+K+L;
  140. E1[K-2]=J*K*L;
  141. }
  142. POUT(N6,(long)J,(long)K,E1[0],E1[1],E1[2],E1[3]);
  143. X=0.5;
  144. Y=0.5;
  145. {
  146. register float x=X;
  147. register float y=Y;
  148. register float t2=T2;
  149. register float t=T;
  150. for(I=0; I<N7; I++)
  151. {
  152. x=t*atan(t2*sin(x)*cos(x)/(cos(x+y)+cos(x-y)-1.0));
  153. y=t*atan(t2*sin(y)*cos(y)/(cos(x+y)+cos(x-y)-1.0));
  154. }
  155. X=x; Y=y;
  156. }
  157. POUT(N7,(long)J,(long)K,X,X,Y,Y);
  158. X=1.0;
  159. Y=1.0;
  160. Z=1.0;
  161. for(I=0; I<N8; I++) P3(&X,&Y,&Z);
  162. POUT(N8,(long)J,(long)K,X,Y,Z,Z);
  163. J=1;
  164. K=2;
  165. L=3;
  166. E1[0]=1.0;
  167. E1[1]=2.0;
  168. E1[2]=3.0;
  169. for(I=0; I<N9; I++) P0();
  170. POUT(N9,(long)J,(long)K,E1[0],E1[1],E1[2],E1[3]);
  171. J=2;
  172. K=3;
  173. for(I=0; I<N10; I++)
  174. {
  175. J+=K;
  176. K+=J;
  177. J-=K;
  178. K-=J+J;
  179. }
  180. POUT(N10,(long)J,(long)K,X1,X2,X3,X4);
  181. X=0.75;
  182. {
  183. register float x=X;
  184. register float t1=T1;
  185. for(I=0; I<N11; I++) x=sqrt(exp(log(x)/t1));
  186. X=x;
  187. }
  188. POUT(N11,(long)J,(long)K,X,X,X,X);
  189. printf("\n %g whetstones per second\n", 1.0e+08/second());
  190. }