[Elecraft] Elecraft CW Net Announcement

kevin kevinr at coho.net
Sat Nov 25 22:25:40 EST 2023


Good Evening,

     It was a much less gloomy week.  In fact it was downright sunny.  
Cold though, at least for here.  Last night it dropped into the high 
teens.  It did get above freezing today but not by much.  The bird basin 
has not thawed.  The elk have carved a new path just inside a younger 
stand of trees nearby.  The hunters have been plentiful so they change 
their habits and don't cross the roads until well after dark.

    The sun is quite speckled, active with current and impending 
events.  The sunspot number and the solar flux are both high, 184 and 
178 respectively.  We are also in the midst of the CQ WW DX contest.  I 
may not be able to find an open space for the twenty meter net.  
However, the contest will terminate right at the forty meter net's 
time.  Again, I will seek an open frequency.



Please join us on (or near):

14050 kHz at 2300z Sunday  (3 PM PST Sunday)
  7047 kHz at 0100z Monday  (5 PM PST Sunday)



73,
       Kevin.  KD5ONS





-





    I am teaching a multi-layered, cylindrical, spring-node mesh how to 
be elastic. These are the elastic functions, based on Hooke's law and 
Newton's first.  I will merge a few of the loops to hasten recovery 
time.  I have implemented a heat gradient function for various heating 
(cooling) geometries to add some color.  Now to invent some creative 
impulse functions to deform the mesh.


float Req = 15.0;                                       // Radial 
equilibrium spacing between nodes
float Teq = 10.0;                                        // Torsion 
spring spacing at equilibrium
float Aeq = 20.0;                                       // Axial spring 
spacing

void map( void )                                        // accumulate 
applied forces
     {
     float RLc, RGc, TLc, TGc;                       // local, global 
change rotation, torsion
     struct node *tmp;                                  // shorten name
     struct node *m1 = m1head;                  // M1 node buffer

         // Axial
     struct pt L, R;                                        // left, 
right force vectors
     float Ka = 0.95;                                     // Axial 
spring constant
     for(int k=0; k<thick; k++)                    // step by cylinder
         for(int j=1; j<leng-1; j++)                // step by ring    
guard ends
             for(int i=0; i<ring; i++)                // step around ring
                 {
                 tmp = (m1 +k*leng*ring +j*ring +i);

                 L = vecMinusVec( tmp->X, (m1 +k*leng*ring +(j-1)*ring 
+i)->X );
                 R = vecMinusVec( tmp->X, (m1 +k*leng*ring +(j+1)*ring 
+i)->X );

                 float mag1 = Aeq - length( L );    // L magnitude
                 float mag2 = Aeq - length( R );    // R magnitude
                 tmp->FA = vecMult( vecPlusVec( scale( L, mag1 ), scale( 
R, mag2 ) ), Ka );
                 }

         // Radial
     struct pt C;                                            // center 
of this ring
     struct pt N;                                            // 
temporary line segment
     struct pt In, Out;                                    // vector to 
inner, vector to outer
     float Kr = 0.33;                                      // radial 
spring constant
     for(int k=0; k<thick; k++)                    // step by cylinder
         for(int j=0; j<leng; j++)                    // step along cylinder
             {        // Need center to create line segments
             C = vector( (m1 +k*leng*ring +j*ring)->X.x, 0, 0); // at i=0;
             for(int i=0; i<ring; i++)                // step around 
cylinder
                 {
                     // Extract node location
                 N = (m1 +k*leng*ring +j*ring +i)->X;

                     // Difference between N and the next inner cylinder
                 if( k==0 )
                     In = vector(0.0, 0.0, 0.0);      // inner node
                 else
                     In = vecMinusVec( N, (m1 +(k-1)*leng*ring +j*ring 
+i)->X );
                     // Difference between N and the next outer cylinder
                 if( k==thick-1 )
                     Out = vector( 0.0, 0.0, 0.0 ); // outer node
                 else
                     Out = vecMinusVec( (m1 +(k+1)*leng*ring +j*ring 
+i)->X, N );

                     // Calculate local and global differences
                 RLc = length( Out ) - length( In );
                 RGc = (r0 +k*Req) - length( vecMinusVec( N, C ) );

                     // Radial restoring force
                 (m1 +k*leng*ring +j*ring +i)->Fr = Kr * ( RGc + RLc );
                 }
             }

         // Torsional
     float Dm, Dp;                                           // angle to 
neighbor -/+ directions
     float Kt = 0.37;                                        // 
torsional spring constant
     for(int k=0; k<thick; k++)                      // step by cylinder
         for(int j=0; j<leng; j++)                      // step along 
cylinder
             for(int i=0; i<ring; i++)                   // step around 
cylinder
                 { //        { 0 <= ring <= 35 }
                 if( i-1 == -1 )                               // guard 
-1 = 35        -1 = ring-1
                     Dm = (360.0 + (m1 +k*leng*ring +j*ring)->pa) - (m1 
+k*leng*ring +j*ring+35)->pa;
                 else // angular distance to previous node
                     Dm = (m1 +k*leng*ring +j*ring +i)->pa - (m1 
+k*leng*ring +j*ring +i-1)->pa;

                 if( i+1 == ring )                            // guard 
36 = 0        i+1 = 36
                     Dp = (360.0 + (m1 +k*leng*ring +j*ring)->pa) - (m1 
+k*leng*ring +j*ring+35)->pa;
                 else // angular distance to next node
                     Dp = (m1 +k*leng*ring +j*ring +i+1)->pa - (m1 
+k*leng*ring +j*ring +i)->pa;

                 Dm = Teq - Dm;                            // set 
circumferential metric
                 Dp = Teq - Dp;                              // +/- = 
compression / tension
                 if( Dp < -359.9 ) Dp += 360;        // bound endpoints
                 if( Dp > 359.9 )  Dp -= 360;
                 if( Dm < -359.9 ) Dm += 360;
                 if( Dm > 359.9 )  Dm -= 360;
                 TLc = Dm - Dp;                            // local change

                 if( i==35 )                                   // global 
change
                     TGc = (i*Teq) - (m1 +k*leng*ring +j*ring +i)->pa;
                 else
                     { // preferred angle - present angle
                     TGc = (i*Teq) - (m1 +k*leng*ring +j*ring +i)->pa;
                     if( TGc < -340.0 )   TGc += 360.0; // MAX twist is 
20 degrees
                     }

                     // Torsional restoring force
                 (m1 +k*leng*ring +j*ring +i)->Ft = Kt * ( TGc + TLc );
                 }

     if( data2 )
         {            // sample at (thick-2, 2, 1)
         tmp = (m1 +(thick-2)*leng*ring +2*ring +1);
         printf("Fr %9.4f   Ft %9.4f   ", tmp->Fr, tmp->Ft );
         printf("FA %9.4f %9.4f %9.4f \n", tmp->FA.x, tmp->FA.y, 
tmp->FA.z );
         }
     }

void restore( void )                                    // move node to 
relieve forces on it
     {
     float rho, Rr;                                          // current 
and new radii
     struct pt X = vector( 0.0, 0.0, 0.0 );      // axial restoration
     struct pt C;                                            // center 
and working vector
     struct node *m1 = m1head;                  // point at head of 
spring mass mesh memory
     struct node *tmp;                                  // shorten name

     for(int k=0; k<thick; k++)                    // step by cylinder
         for(int j=0; j<leng; j++)                    // step by ring  
guard ends
             { // center the i=0 point
             C = vector( (m1 +k*leng*ring +j*ring)->X.x, 0, 0 );
             for(int i=0; i<ring; i++)                // step around ring
                 {                                               // 
spring restoration
                 tmp = m1 +k*leng*ring+j*ring+i;    // shorten name

                     // torsional portion                 X = F/m *dt*dt
                 tmp->pa += (tmp->Ft / m) *dt*dt;    // current angle 
plus change
                 if( tmp->pa > 359.9 )     tmp->pa -= 360.0;    // bound 
result
                 if( tmp->pa < -359.9 )     tmp->pa += 360.0;

                     // radial portion
                 rho = length( vecMinusVec( tmp->X, C ));  // current 
radius
                 Rr = rho + (tmp->Fr / m) *dt*dt;     // current radius 
plus change

                     // axial portion
                 X = vecPlusVec( tmp->X, vecMult( vecDiv( tmp->FA, m ), 
dt*dt ));
                 X.z = Rr * cos( tmp->pa * RAD );    // convert Rr,->pa 
to Y,Z location
                 X.y = Rr * sin( tmp->pa * RAD );
                 tmp->X = X; // update changes
                 }
             }
     }



"How old are you?  I mean really, you are old now, aren't you?"

"For an apricot, yes.  For a head of lettuce, even more so.
For a mountain, I have not even begun in years.  For a man, I am just 
right."





More information about the Elecraft mailing list