int udp_marker_rec_get_bytes(struct my_data_t *my_data) {
    int n_all=0,n=0;
    my_data->co_new_data = 0;
    while (true) {
        n = recv(my_data->socket_id, my_data->cbuf, 1500, 0);
        if (n==VISU_DATA_LENGTH) { /* receiving data with correct length */
#           ifdef DEBUG
            printf("Correct packet received.\n");
#           endif
            memcpy(&my_data->header, my_data->cbuf, HEADERSIZE);
            unsigned int k = HEADERSIZE;
            for (unsigned int i = 0; i < SEGMENTNUMBER; i++) {
                memcpy(&my_data->Data[i], &my_data->cbuf[k + i * DATASIZE], DATASIZE);
            }
            for (unsigned int p = 0; p < SEGMENTNUMBER; p++) {
                if (n==VISU_DATA_LENGTH) {
                    /* x, y, and z position coordinates*/
                    my_data->co_marker_data[p*7]   = (double)(little2big(my_data->Data[p].Xcoord1,my_data->Data[p].Xcoord2,my_data->Data[p].Xcoord3,my_data->Data[p].Xcoord4));
                    my_data->co_marker_data[p*7+1] = (double)(little2big(my_data->Data[p].Ycoord1,my_data->Data[p].Ycoord2,my_data->Data[p].Ycoord3,my_data->Data[p].Ycoord4));
                    my_data->co_marker_data[p*7+2] = (double)(little2big(my_data->Data[p].Zcoord1,my_data->Data[p].Zcoord2,my_data->Data[p].Zcoord3,my_data->Data[p].Zcoord4));
                    /* quaternion data */
                    my_data->co_marker_data[p*7+3] = (double)(little2big(my_data->Data[p].Qre1,my_data->Data[p].Qre2,my_data->Data[p].Qre3,my_data->Data[p].Qre4));
                    my_data->co_marker_data[p*7+4] = (double)(little2big(my_data->Data[p].Qi1,my_data->Data[p].Qi2,my_data->Data[p].Qi3,my_data->Data[p].Qi4));
                    my_data->co_marker_data[p*7+5] = (double)(little2big(my_data->Data[p].Qj1,my_data->Data[p].Qj2,my_data->Data[p].Qj3,my_data->Data[p].Qj4));
                    my_data->co_marker_data[p*7+6] = (double)(little2big(my_data->Data[p].Qk1,my_data->Data[p].Qk2,my_data->Data[p].Qk3,my_data->Data[p].Qk4));
                }
            }
            my_data->co_new_data = 1;
            break;
        } else {
#   ifdef DEBUG
#   ifdef WIN32
            printf("Return of recv(): %ld\n", n );
            printf("Error at recv(): %ld\n", WSAGetLastError() );
#   endif
#   endif
            break;
        }
    }
    return n_all;
}
int StVKReducedInternalForces::LoadFromStream(FILE * fin, int rTarget, int bigEndianMachine) 
{
  if (verbose)
    printf("Loading polynomials assuming little endian machine: %s.", (!bigEndianMachine) ? "TRUE" : "FALSE");

  int header[4];

  if ((int)(fread(header, sizeof(int), 4, fin)) < 4)
  {
    printf("Error: couldn't read from input cubic polynomial file.\n");
    throw 1;
  }
  
  r = header[0];

  int buffer;
  if (bigEndianMachine)
  {
    little2big(&r, &buffer, sizeof(int));
    r = buffer;
  }

  if (rTarget > r)
  {
    printf("Error: the input cubic polynomial file has r=%d, but you requested %d > %d.\n", r, rTarget, r);
    throw 2;
  }

  // first read in the coefficients as if all modes requested
  if (verbose)
    printf(" r=%d\n", r);
  
  r2 = r * r;

  linearSize = header[1];

  if (bigEndianMachine)
  {
    little2big(&linearSize, &buffer, sizeof(int));
    linearSize = buffer;
  }

  quadraticSize = header[2];

  if (bigEndianMachine)
  {
    little2big(&quadraticSize, &buffer, sizeof(int));
    quadraticSize = buffer;
  }

  cubicSize = header[3];

  if (bigEndianMachine)
  {
    little2big(&cubicSize, &buffer, sizeof(int));
    cubicSize = buffer;
  }

  linearCoef_ = (double*) malloc (sizeof(double) * r * linearSize);

  if ((int)(fread(linearCoef_,sizeof(double),r*linearSize,fin)) < r*linearSize)
  {
    printf("Error: couldn't read from input cubic polynomial file.\n");
    throw 1;
  }

  double bufferd;
  if (bigEndianMachine)
  {
    for(int i=0; i<r*linearSize; i++)
    {
      little2big(&linearCoef_[i], &bufferd, sizeof(double));
      linearCoef_[i] = bufferd;
    }
  }

  quadraticCoef_ = (double*) malloc (sizeof(double) * r * quadraticSize);

  if ((int)(fread(quadraticCoef_,sizeof(double),r*quadraticSize,fin)) < r*quadraticSize)
  {
    printf("Error: couldn't read from input cubic polynomial file.\n");
    throw 1;
  }

  if (bigEndianMachine)
  {
    for(int i=0; i<r*quadraticSize; i++)
    {
      little2big(&quadraticCoef_[i], &bufferd, sizeof(double));
      quadraticCoef_[i] = bufferd;
    }
  }

  cubicCoef_ = (double*) malloc (sizeof(double) * r * cubicSize);

  if ((int)(fread(cubicCoef_,sizeof(double),r*cubicSize,fin)) < r*cubicSize)
  {
    printf("Error: couldn't read from input cubic polynomial file.\n");
    throw 1;
  }

  if (bigEndianMachine)
  {
    for(int i=0; i<r*cubicSize; i++)
    {
      little2big(&cubicCoef_[i], &bufferd, sizeof(double));
      cubicCoef_[i] = bufferd;
    }
  }

  if (rTarget >= 0)
  {
    int linearSizeTarget, quadraticSizeTarget, cubicSizeTarget;
    GetSizes(rTarget, &linearSizeTarget, &quadraticSizeTarget, &cubicSizeTarget);

    double * linearCoefTemp_ = 
      (double*) malloc (sizeof(double) * rTarget * linearSizeTarget);

    double * quadraticCoefTemp_ = 
      (double*) malloc (sizeof(double) * rTarget * quadraticSizeTarget);

    double * cubicCoefTemp_ = 
      (double*) malloc (sizeof(double) * rTarget * cubicSizeTarget);

    for(int output=0; output<rTarget; output++)
      for(int i=0; i<rTarget; i++)
      {
        SetSizes(rTarget);
        int positionTarget = linearCoefPos(output, i); 
        SetSizes(r);
        int position = linearCoefPos(output, i); 
        linearCoefTemp_[positionTarget] = linearCoef_[position];
      }
 
    for(int output=0; output<rTarget; output++)
      for(int i=0; i<rTarget; i++)
        for(int j=i; j<rTarget; j++)
        {
          SetSizes(rTarget);
          int positionTarget = quadraticCoefPos(output, i, j); 
          SetSizes(r);
          int position = quadraticCoefPos(output, i, j); 
          quadraticCoefTemp_[positionTarget] = quadraticCoef_[position];
        }

    for(int output=0; output<rTarget; output++)
      for(int i=0; i<rTarget; i++)
        for(int j=i; j<rTarget; j++)
          for(int k=j; k<rTarget; k++)
          {
            SetSizes(rTarget);
            int positionTarget = cubicCoefPos(output, i, j, k); 
            SetSizes(r);
            int position = cubicCoefPos(output, i, j, k); 
            cubicCoefTemp_[positionTarget] = cubicCoef_[position];
          }

    r = rTarget;
    SetSizes(r);

    free(linearCoef_);
    free(quadraticCoef_);
    free(cubicCoef_);

    linearCoef_ = linearCoefTemp_;
    quadraticCoef_ = quadraticCoefTemp_;
    cubicCoef_ = cubicCoefTemp_;
  }

  volumetricMesh = NULL;
  U = NULL;
  reducedGravityForce = NULL;
  precomputedIntegrals = NULL;
  numElementVertices = 0;
  muLame = NULL;

  InitBuffers();

  addGravity = false;

  useSingleThread = 0;
  shallowCopy = 0;
  g=9.81; 

  return 0;
}