Self Adapting Application Level Fault Tolerance for Parallel and Distributed Computing