Data Logging Stops After Losing GPS Signal

Brad, this is the code I most recently ran on the Arduino.

#include <TinyGPS++.h>
#include <SD.h>



#define ADC_ref 5.0
#define analog_resolution 1024.0

#define zero_x 1.60156
#define zero_y 1.60156
#define zero_z 1.64551

#define sensitivity_x 0.33
#define sensitivity_y 0.33
#define sensitivity_z 0.31
 
//Establishing GPS
TinyGPSPlus gps;


//Digital Pins
int CS_pin = 53;
int PulsePin = 40;
int GPSOff= 35;
int GPSOn = 33;


//Establishing Variables' Types
unsigned int value_x;
unsigned int value_y;
unsigned int value_z;
unsigned long durationHigh;
unsigned long durationLow;
long AirTemp;
long FanTemp;
float timer;
float latitude;
float longitude;
float monthdata;
float daydata;
float hourdata;
float mindata;
float secdata;
float vel;
float sentences;


float xv;
float yv;
float zv;

float angle_x;
float angle_y;
float angle_z;

boolean hasrun = false;
long AccZ;


void setup()
{
  Serial.begin(115200);
  Serial3.begin(4800);
  Serial.println("Initializing Card");
  
  //Choosing Pin Modes
  pinMode(CS_pin, OUTPUT);
  pinMode (GPSOff, OUTPUT);
  pinMode (GPSOn, OUTPUT);
  pinMode(PulsePin, INPUT);

  
//Check to see if SD Works
if(!SD.begin(CS_pin))
{
  Serial.println("Card Failed");
  return;
}

Serial.println("Card Ready");
}

void loop()
{
  
  //LED Condition
  sentences = (gps.sentencesWithFix());
  //Digital Inputs
  durationHigh = pulseIn(PulsePin, HIGH , 500000);
  durationLow = pulseIn(PulsePin, LOW, 500000);
  
  timer = millis();
  
  //Analog Inputs
  FanTemp = analogRead(0);
  AirTemp = analogRead(1);
  value_x = analogRead(2);
  value_y = analogRead(3);
  value_z = analogRead(4);
 
  //Acceleration Manipulation
  xv = (value_x/analog_resolution*ADC_ref-zero_x)/sensitivity_x;
  yv = (value_y/analog_resolution*ADC_ref-zero_y)/sensitivity_y;
  zv = (value_z/analog_resolution*ADC_ref-zero_z)/sensitivity_z;
  
  //Tilt Angle
  angle_x = atan2(-yv,-zv)*RAD_TO_DEG;
  angle_y = atan2(-xv,-zv)*RAD_TO_DEG;
  angle_z = atan2(-yv,-xv)*RAD_TO_DEG;
  
  //GPS
    while (Serial3.available() > 0)
  {
   gps.encode(Serial3.read());
  }
  
  if (gps.location.isUpdated())
  {
  latitude = (gps.location.lat() , 8);
  longitude = (gps.location.lng(), 8);
  }
  
  else if (gps.speed.isUpdated())
  {
    vel = (gps.speed.mph());
  }
  
  else if (gps.time.isUpdated())
  {
  hourdata =(gps.time.hour());
  mindata = (gps.time.minute());
  secdata = (gps.time.second());
  }

else if (gps.date.isUpdated());
{
  monthdata = (gps.date.month());
  daydata = (gps.date.day());
}
  
 
 //Establishing SD File 
  File dataFile = SD.open ("log.csv", FILE_WRITE);
  File GPSFile = SD.open ("GPS.csv", FILE_WRITE);
  
  

  
//Writing Headers
  if (hasrun == false)
  {
    //Debugging to Serial Monitor, can be trimmed for final design
    Serial.print("Time (seconds)");
    Serial.print(",");
    
    Serial.print("Time between Pulses HIGH (microseconds)");
    Serial.print(",");
    
    Serial.print("Time between Pulses LOW (microseconds)");
    Serial.print(",");
    
    Serial.print("X Acceleration(G's)");
    Serial.print(" , ");
    
    Serial.print("Y Acceleration(G's)");
    Serial.print(" , ");
    
    Serial.print("Z Acceleration(G's)");
    Serial.print(" , ");
    
    Serial.print("X Angle(deg)");
    Serial.print(" , ");
    
    Serial.print("Y Angle(deg)");
    Serial.print(" , ");
    
    Serial.print("Z Angle(deg)");
    Serial.print(",");
    
    Serial.print("Fan Temperature (Celcius)");
    Serial.print(",");
    
    Serial.print("Air Temperature (Celcius)");
    Serial.print(",");
    
    Serial.print("Date and Time");
    Serial.print(",");
    
    Serial.print("Latitude");
    Serial.print(",");
    
    Serial.println("Longitude");
    
    //Writing Data to SD Card
    dataFile.print("Time (seconds)");
    dataFile.print(",");
    
    dataFile.print("Time between Pulses HIGH (microseconds)");
    dataFile.print(",");
    
    dataFile.print("Time between Pulses LOW (microseconds)");
    dataFile.print(",");
   
    dataFile.print("X Acceleration(G's)");
    dataFile.print(" , ");
    
    dataFile.print("Y Acceleration(G's)");
    dataFile.print(" , ");
    
    dataFile.print("Z Acceleration(G's)");
    dataFile.print(" , ");
    
    dataFile.print("X Angle(deg)");
    dataFile.print(" , ");
    
    dataFile.print("Y Angle(deg)");
    dataFile.print(" , ");
    
    dataFile.print("Z Angle(deg)");
    dataFile.print(",");
    
    dataFile.print("Fan Temperature (Celcius)");
    dataFile.print(",");
    
    dataFile.println("Air Temperature (Celcius)");
    
    GPSFile.print("Date and Time");
    GPSFile.print(",");
    
    GPSFile.print("Latitude");
    GPSFile.print(",");
    
    GPSFile.print("Longitude");
    GPSFile.print(",");
    
    GPSFile.println("Speed");
    hasrun = true;
  }

if ( sentences == 0)
{
digitalWrite(GPSOff, LOW);
delay(300);
digitalWrite(GPSOff,HIGH);
delay(300);
digitalWrite(GPSOn,LOW);
}

else
{
  digitalWrite(GPSOn,HIGH);
}

if (dataFile)
  {
    
    //Writing Data to SD Card
    dataFile.print(timer/1000);
    dataFile.print(',');
    
    dataFile.print(durationHigh);
    dataFile.print(',');
    
    dataFile.print(durationLow);
    dataFile.print(',');
    
    dataFile.print(xv);
    dataFile.print(" , ");
  
    dataFile.print(yv);
    dataFile.print(" , ");
  
    dataFile.print(zv);
    dataFile.print(" , ");
    
    dataFile.print(angle_x);
    dataFile.print(" , ");
  
    dataFile.print(angle_y);
    dataFile.print(" , ");
  
    dataFile.print(angle_z);
    dataFile.print(",");
    
    
    dataFile.print(FanTemp*0.484375-1.6875);
    dataFile.print(',');
    
    dataFile.println(AirTemp*0.484375-1.6875);
    dataFile.close();

    GPSFile.print(monthdata  );
    GPSFile.print(daydata  );
    GPSFile.print(hourdata  );
    GPSFile.print(mindata  );
    GPSFile.print(secdata  );
    GPSFile.print(",");
    
    GPSFile.print(latitude);
    GPSFile.print(",");
    
    GPSFile.print(longitude);
    GPSFile.print(",");
    
    GPSFile.println(vel);
    
    GPSFile.close();

    
    //Viewing Data on Computer
    Serial.print(timer/1000);
    Serial.print(',');
    
    Serial.print(durationHigh);
    Serial.print(',');
    
    Serial.print(durationLow);
    Serial.print(',');
    
    Serial.print(xv);
    Serial.print(" , ");
  
    Serial.print(yv);
    Serial.print(" , ");
  
    Serial.print(zv);
    Serial.print(" , ");
    
    Serial.print(angle_x);
    Serial.print(" , ");
  
    Serial.print(angle_y);
    Serial.print(" , ");
  
    Serial.print(angle_z);
    Serial.print(",");

    
    Serial.print(FanTemp*0.484375-1.6875);
    Serial.print(',');
    
    Serial.print(AirTemp*0.484375-1.6875);
    Serial.print(',');
    
    Serial.print(monthdata  );
    Serial.print(daydata  );
    Serial.print(hourdata  );
    Serial.print(mindata  );
    Serial.print(secdata  );
    Serial.print(",");
    
    Serial.print(latitude);
    Serial.print(",");
    
    Serial.print(longitude);
    Serial.print(",");
    
    Serial.println(vel);
   
    
    
  }
  else
  {
    Serial.println("Couldn't access file");
  }
delay (100);
}

Reading through that code for the LED, I think I know what you're going for. So lastUpdated is tied to the most recent iteration isUpdated was changed to true? However, this is what I found for the isUpdated() as well as isValid() function on the TinyGPS++ (below).

The isValid() method will tell you whether the object contains any valid data and is safe to query.
Similarly, isUpdated() indicates whether the object’s value has been updated (not necessarily changed) since the last time you queried it.

My concern is that isUpdated will be changed to true even if the GPS doesn't have a fix. However, if you've done this before with TinyGPS++ I will certainly defer to you.